你如何对NSOutlineView进行子类化?
答案 0 :(得分:14)
首先,在您对一个对象进行子类化之前,您应该问自己“我需要这样做吗?”。子类化是一种更复杂的交互和扩展其他类功能的方式,因此您应该确保通过其他更简单的方法(如委派,通知等)轻松实现您要实现的目标。显然,如果您正在尝试要改变控件的外观,通过子类化可以更轻松地完成,但请确保检查所有其他可用选项。请记住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
的{{1}}方法,则可以在子类的实现中执行以下操作:
drawRect:
当您的课程调用- (void)drawRect:(NSRect)rect //Method signature from the docs
{
//Code here
}
时,您的代码将被执行,而不是drawRect:
中的代码。
您还可以在树中传递方法调用,以获取您不想处理的方法。默认情况下这是完成的,所以你不需要创建只在NSView
上调用方法的空方法,但是,如果你覆盖一个方法并希望允许你的一个超类首先处理它,你可以做以下内容:
super
如果您想更改类中的变量,这将是有益的,例如,通过首先将方法调用传递给树来提供方法的默认实现。
子类化可能是一个相当复杂的过程,特别是对于像控件这样的复杂对象,尽管它非常有用且功能强大。
答案 1 :(得分:3)
@interface MyOutlineView : NSOutlineView
{
...
}
...
@end