ControlCell如何交互

Control通常与一个或多个Cell相关联,这些Cell是抽象类NSCell的子类的实例。Control的一个或多个Cell通常恰好位于Control的边界之内。Cell是可以绘制自身并响应事件的对象,但是它们只能根据其Control的指示来间接地这样做,这是一种协调的背景。

Control管理其Cell的行为。通过从NSView继承,Control可以响应用户的操作并呈现其在屏幕上的表示。当用户单击Control时,它会通过将trackMouse:inRect:ofView:untilMouseUp:发送到所单击的Cell来部分响应。收到此消息后,Cell会跟踪鼠标,并可能使ControlCell的操作消息发送到其Target(鼠标上移还是连续发送,取决于Cell的属性)。当Control收到显示请求时,它们依次向其一个或多个Cell发送一条drawWithFrame:inView:消息,以使这些Cell进行绘制。

ControlCell之间的这种关系使两件事情成为可能:一个Control可以管理不同类型、TargetAction不同的Cell(请参阅下文),而单个Control可以管理多个Cell。大多数Application KitControl(如NSButtonsNSTextFields)仅管理单个Cell。但是某些Control(尤其是NSMatrixNSForm)可以管理多个Cell(通常具有相同的大小和属性,并以规则的方式排列)。由于CellControl轻,因此在继承数据和行为方面,使用多CellControl比使用多个Control更有效。

NSControl的许多方法(尤其是设置或获取值和属性的方法)在NSCell中都有相应的方法。向Control发送消息会导致将其转发到ControlCell或(如果是多Cell控件,则)其选定的Cell。但是,许多NSControl方法仅在具有单个CellControl中有效(这些方法说明中已提到)。

NSControl子类无需使用NSCell子类即可实现自身——NSScrollerNSColorWell是不需要这样做的NSControl的示例。但是,这样的子类必须处理NSCell所处理的细节。具体来说,它们必须重写设计用于Cell的方法。而且,缺少Cell意味着你无法利用NSMatrix功能来管理多Cell阵列,例如单选按钮