NSMatrix вызывает методы NSFormCell для прототипа NSTextFieldCell

Я создал NSMatrix с NSTextFieldCell в качестве его прототипа. Но когда представление добавляется в окно и рисуется, я получаю эту ошибку:

-[NSTextFieldCell setTitleWidth:]: unrecognized selector sent to instance 0x21191040

Почему Какао вызывает setTitleWidth: в прототипе NSTextFieldCell? setTitleWidth: это метод NSFormCell, а не метод NSTextFieldCell.

Если я создаю подкласс этого прототипа и добавляю фиктивные методы для setTitleWidth: и titleWidth:, все работает, но это, несомненно, подделка.

Есть идеи, что происходит? Ниже приведен соответствующий раздел рабочего кода:

(defclass easygui::cocoa-matrix-cell (easygui::cocoa-extension-mixin ns:ns-text-field-cell)
  ((title-width :accessor title-width))
  (:metaclass ns:+ns-object))

(objc:defmethod (#/setTitleWidth: void) ((self easygui::cocoa-matrix-cell) (width :<CGF>LOAT))
  (setf (title-width self) width))

(objc:defmethod (#/titleWidth: :<CGF>LOAT) ((self easygui::cocoa-matrix-cell) (size :<NSS>IZE))
  (title-width self))

(defmethod initialize-instance :after ((view sequence-dialog-item) &key)
  (let ((cocoa-matrix (cocoa-ref view))
        (prototype (#/init (#/alloc easygui::cocoa-matrix-cell))))
    (#/setPrototype: cocoa-matrix prototype)
    (#/setMode: cocoa-matrix #$NSListModeMatrix)
    (#/setIntercellSpacing: cocoa-matrix (ns:make-ns-size 0 0))
    (set-cell-size view (cell-size view))
    (set-table-sequence view (table-sequence view))
    ))

1 ответ

Решение

Оказалось, что мой NSMatrix объект был на самом деле NSForm объект. Последний наследует от первого, но требует, чтобы он использовал NSFormCell как его прототип. Я пытался использовать NSTextFieldCell прототип для NSForm объект, поэтому NSFormCell методы все еще вызывались.

Здесь были необходимые изменения:

-(defclass easygui::cocoa-matrix (easygui::cocoa-extension-mixin ns:ns-form)
+(defclass easygui::cocoa-matrix (easygui::cocoa-extension-mixin ns:ns-matrix)
Другие вопросы по тегам