Control
与Cell
如何交互
Control
通常与一个或多个Cell
相关联,这些Cell
是抽象类NSCell
的子类的实例。Control
的一个或多个Cell
通常恰好位于Control
的边界之内。Cell
是可以绘制自身并响应事件的对象,但是它们只能根据其Control
的指示来间接地这样做,这是一种协调的背景。
Control
管理其Cell
的行为。通过从NSView
继承,Control
可以响应用户的操作并呈现其在屏幕上的表示。当用户单击Control
时,它会通过将trackMouse:inRect:ofView:untilMouseUp:
发送到所单击的Cell
来部分响应。收到此消息后,Cell
会跟踪鼠标,并可能使Control
将Cell
的操作消息发送到其Target
(鼠标上移还是连续发送,取决于Cell
的属性)。当Control
收到显示请求时,它们依次向其一个或多个Cell
发送一条drawWithFrame:inView:
消息,以使这些Cell
进行绘制。
Control
与Cell
之间的这种关系使两件事情成为可能:一个Control
可以管理不同类型、Target
和Action
不同的Cell
(请参阅下文),而单个Control
可以管理多个Cell
。大多数Application KitControl
(如NSButtons
和NSTextFields
)仅管理单个Cell
。但是某些Control
(尤其是NSMatrix
和NSForm
)可以管理多个Cell
(通常具有相同的大小和属性,并以规则的方式排列)。由于Cell
比Control
轻,因此在继承数据和行为方面,使用多Cell
的Control
比使用多个Control
更有效。
NSControl
的许多方法(尤其是设置或获取值和属性的方法)在NSCell
中都有相应的方法。向Control
发送消息会导致将其转发到Control
的Cell
或(如果是多Cell
的控件
,则)其选定的Cell
。但是,许多NSControl
方法仅在具有单个Cell
的Control
中有效(这些方法说明中已提到)。
NSControl
子类无需使用NSCell
子类即可实现自身——NSScroller
和NSColorWell
是不需要这样做的NSControl
的示例。但是,这样的子类必须处理NSCell
所处理的细节。具体来说,它们必须重写设计用于Cell
的方法。而且,缺少Cell
意味着你无法利用NSMatrix
功能来管理多Cell
阵列,例如单选按钮
。