子类化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还可以帮助你定义自定义子类,包括框架控件类的子类,例如NSButton和NSSlider。Interface Builder还允许你将放置的Control对象的类更改为自定义Control类,但是App的早期版本无法对与Control对象关联的自定义Cell进行相同的操作。
但是使用Interface Builder3.0版,你可以设置Control Cell的类。为此,请单击Control以将其选中,然后右键单击鼠标(按住Control键单击单键鼠标)。然后再次在出现的弹出列表的右上角单击。子菜单列出了鼠标指针下方的对象,包括Control的Cell。对于NSSliderCell对象,如图1所示,子菜单包含“Slider Cell”项。选择Cell项。

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

如果没有3.0版本的Interface Builder,你仍然可以通过编程的方式将自定义Cell的实例分配给自定义Control,如例1所示。在自定义Control子类中,当从nib初始化时,创建自定义Cell的实例,并为其分配当前Cell的所有相关属性。然后使用NSControl的setCell:方法将自定义Cell设置为Control的Cell。
例1 为自定义Control创建和设置自定义Cell
- (void)awakeFromNib {MySliderCell *newCell = [[MySliderCell alloc] init];id oldCell = [self cell];[newCell setImage:[oldCell image]];[newCell setMinValue:[oldCell minValue]];[newCell setMaxValue:[oldCell maxValue]];[newCell setSliderType:[oldCell sliderType]];// .... set other slider cell attributes[self setCell:newCell];[newCell release];}
每当Control需要为其自己创建一个新Cell时(例如,如果它是使用initWithFrame:实例化的),都可以重写cellClass方法。initWithFrame:方法使用cellClass的返回值来分配和初始化正确类型的NSCell对象。
例2 重写cellClass
+ (Class) cellClass{return [MySliderCell class];}
注意 重写NSControl的cellClass类方法不会更改从nib文件创建的Cell对象的类。
