你将如何子类化一个 NSOutlineView?
2 回答
首先,在对对象进行子类化之前,您应该问自己“我需要这样做吗?”。子类化是一种更复杂的交互和扩展其他类功能的方式,所以你应该确保你试图实现的目标不能通过另一个更简单的方法轻松实现,例如委托、通知等。显然,如果你正在尝试要更改控件的外观,这将通过子类化更容易完成,但请确保检查所有其他可用选项。请记住,它NSOutlineView
有一个相当长的对象树 - 它继承自NSTableView
,继承自NSControl
,继承自NSView
,继承自NSResponder
,继承自NSObject
,并且这些类中的每一个中都存在各种帮助方法,它们通常可以帮助您实现您想要的。
但是,如果您检查所有这些选项并决定子类化NSOutlineView
,这取决于您想对子类做什么。创建子类外壳的最简单方法是选择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
.
您还可以将方法调用向上传递给您不想处理的方法。这是默认完成的,因此您不需要创建简单地调用方法 on 的空方法super
,但是,如果您覆盖一个方法并希望允许您的超类之一首先处理它,您可以执行以下操作:
- (void)expandItem:(id)item
{
[super expandItem:item];
//Your code here
}
例如,如果您想更改类中的变量,但通过首先将方法调用传递给树来提供方法的默认实现,这将是有益的。
子类化可能是一个相当复杂的过程,特别是对于像控件这样的复杂对象,尽管它可能非常有用和强大。
@interface MyOutlineView : NSOutlineView
{
...
}
...
@end