子类化NSControl

如果要创建执行其自身初始化的自定义NSControl类,则应重写指定的初始化程序(initWithFrame:)。但是请注意,当从nil文件创建Application Kit Control类的子类的实例时,不会调用此方法。

如果创建与自定义Cell子类配对的自定义Control子类(例如,NSSlider的自定义子类和NSSliderCell的自定义子类),则可以通过两种方式将该自定义Cell的实例与该自定义Control的实例相关联。第一种方法要求你具有3.0版的Interface Builder。在Interface Builder中,将Control放在窗口上时,将实例化Control及其Cell,并在保存用户界面时将这些对象(以及其他放置的对象)编码并序列化为nib文件。Interface Builder还可以帮助你定义自定义子类,包括框架控件类的子类,例如NSButtonNSSliderInterface Builder还允许你将放置的Control对象的类更改为自定义Control类,但是App的早期版本无法对与Control对象关联的自定义Cell进行相同的操作。

但是使用Interface Builder3.0版,你可以设置Control Cell的类。为此,请单击Control以将其选中,然后右键单击鼠标(按住Control键单击单键鼠标)。然后再次在出现的弹出列表的右上角单击。子菜单列出了鼠标指针下方的对象,包括ControlCell。对于NSSliderCell对象,如图1所示,子菜单包含“Slider Cell”项。选择Cell项。

图1在Interface Builder中选择`Control`的`Cell`

接下来,打开所选Cell对象的Inspector窗口。找到“Object inspector”部分,然后在Custom Class组合框中选择(或输入)自定义Cell类的名称。

图2设置`Control`的自定义`Cell`类

如果没有3.0版本的Interface Builder,你仍然可以通过编程的方式将自定义Cell的实例分配给自定义Control,如例1所示。在自定义Control子类中,当从nib初始化时,创建自定义Cell的实例,并为其分配当前Cell的所有相关属性。然后使用NSControlsetCell:方法将自定义Cell设置为ControlCell

例1 为自定义Control创建和设置自定义Cell

  1. - (void)awakeFromNib {
  2. MySliderCell *newCell = [[MySliderCell alloc] init];
  3. id oldCell = [self cell];
  4. [newCell setImage:[oldCell image]];
  5. [newCell setMinValue:[oldCell minValue]];
  6. [newCell setMaxValue:[oldCell maxValue]];
  7. [newCell setSliderType:[oldCell sliderType]];
  8. // .... set other slider cell attributes
  9. [self setCell:newCell];
  10. [newCell release];
  11. }

每当Control需要为其自己创建一个新Cell时(例如,如果它是使用initWithFrame:实例化的),都可以重写cellClass方法。initWithFrame:方法使用cellClass的返回值来分配和初始化正确类型的NSCell对象。

例2 重写cellClass

  1. + (Class) cellClass
  2. {
  3. return [MySliderCell class];
  4. }

注意 重写NSControlcellClass类方法不会更改从nib文件创建的Cell对象的类。