您如何对NSOutlineView进行子类化?
首先,在您对一个对象进行子类化之前,您应该问自己"我需要这样做吗?".子类是交互及扩展其他类的功能更复杂的方式,所以你应该确保你正在努力实现什么不能轻易地通过另一个实现,更简单的方法,如代表团,通知等.显然,如果你想要改变控件的外观,通过子类化可以更轻松地完成,但请确保检查所有其他可用选项.请记住,NSOutlineView
有一个相当长的对象树-它继承NSTableView
,从继承NSControl
,其继承NSView
,其继承NSResponder
来自继承NSObject
,并有往往可以帮助你实现的各种辅助方法存在于每个类的你想要什么.
但是,如果您检查所有这些选项并决定子类NSOutlineView
,则它取决于您要对子类执行的操作.创建子类shell的最简单方法是选择File > New File
然后选择Objective-C class
,就像使用任何其他类一样,它将创建一个新类,包含继承自的头和实现文件NSObject
.然后,您只需更改头文件中的行:
@interface MyClass : NSObject { // Where MyClass is the name of your class
至
@interface MyClass : NSOutlineView {
这会导致你的类继承NSOutlineView
.由于它是它的子类NSOutlineView
,因此这为您提供了很多机会来更改控件的默认行为.
由于您要创建一个子类,您可以更改任何方法了对象树的默认实现-也就是说,你可以覆盖声明的方法NSOutlineView
,NSTableView
,NSControl
,NSView
,NSResponder
和NSObject
(虽然应该极少覆盖方式宣布NSObject
).您不需要在头文件中重新定义方法签名,您可以通过在子类的实现中实现它来简单地覆盖该函数.例如,如果要覆盖NSView
的drawRect:
方法,则在子类的实现中执行以下操作:
- (void)drawRect:(NSRect)rect //Method signature from the docs { //Code here }
当drawRect:
你的课程被调用时,你的代码将被执行而不是代码NSView
.
您还可以在树中传递方法调用,以获取您不想处理的方法.这是默认情况下完成的,因此您不需要创建只调用方法的空方法super
,但是,如果您重写方法并希望允许其中一个超类首先处理它,则可以执行以下操作:
- (void)expandItem:(id)item { [super expandItem:item]; //Your code here }
例如,如果您想更改类中的变量,这将是有益的,但通过首先将方法调用传递给树来提供方法的默认实现.
子类化可能是一个相当复杂的过程,特别是对于像控件这样的复杂对象,尽管它可以非常有用和强大.