2009-06-14 90 views
-7

你将如何子类NSOutlineView?子类化NSOutlineView

+3

简短的回答是:你用同样的方法子类化任何对象。你应该尝试更具体的问题。苹果的文档涵盖了子类,所以我们必须假设你已经阅读并尝试了一些东西然后被卡住了。你卡在哪里? – 2009-06-14 08:46:36

+0

对不起,我没有阅读所有关于子类的Apple文档。 – Joshua 2009-06-14 13:54:22

回答

14

首先,你子类的对象之前,你应该问自己“我需要这样做吗?”。子类化是交互和扩展其他类的功能的一种更复杂的方式,所以你应该确保你想要实现的内容不能通过另一个更简单的方法,例如委托,通知等来轻易实现。显然,如果你尝试要改变控件的外观,这将通过子类化更容易完成,但要确保检查所有其他可用选项。请记住,NSOutlineView有一个相当长的对象树 - 它继承自NSTableView,它继承自NSControl,它继承自NSView,继承自,它继承自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宣布,NSTableViewNSControlNSViewNSResponderNSObject方法,(虽然你应该很少覆盖在NSObject中声明的方法)。你不需要在你的头文件中重新定义方法签名,你可以通过在你的子类的实现中实现它来覆盖函数。例如,如果你想覆盖的NSViewdrawRect:方法,你会做以下的子类的实现:

- (void)drawRect:(NSRect)rect //Method signature from the docs 
{ 
    //Code here 
} 

drawRect:是在你的类调用,你的代码会被执行,而不是在NSView代码。

你也可以通过方法调用你不想处理的方法。这是默认完成的,所以您不需要创建空方法,只需调用super上的方法,但是,如果您重写某个方法并希望允许其中一个超类先处理它,则可以执行以下操作:

- (void)expandItem:(id)item 
{ 
    [super expandItem:item]; 

    //Your code here 
} 

例如,如果您想更改类中的某个变量,这将是有益的,但通过首先将该方法调用到树上来提供方法的默认实现。

子类化可以是一个相当复杂的过程,特别是对于像控件这样的复杂对象,虽然它可能非常有用和强大。

3

@interface MyOutlineView : NSOutlineView { ... } ... @end

+0

哦,我明白了,我会在什么地方放点? – Joshua 2009-06-14 07:56:50