子类化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 Builder
3.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
对象的类。