NSMatrix在NSTextFieldCell原型上调用NSFormCell的方法

时间:2013-05-23 04:26:08

标签: cocoa common-lisp ccl

我创建了一个以NSTextFieldCell为原型的NSMatrix。但是当视图添加到窗口并绘制时,我收到此错误:

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

为什么Cocoa在NSTextFieldCell原型上调用setTitleWidth: 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 个答案:

答案 0 :(得分:0)

事实证明,我的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)