子类化NSOutlineView

时间:2009-06-14 07:47:49

标签: objective-c cocoa nsoutlineview

你如何对NSOutlineView进行子类化?

2 个答案:

答案 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的子类,因此这为您提供了很多机会来更改控件的默认行为。

由于您正在创建子类,因此可以更改对象树上任何方法的默认实现 - 也就是说,您可以覆盖在NSOutlineViewNSTableViewNSControl中声明的方法,NSViewNSResponderNSObject(尽管您应该很少覆盖NSObject中声明的方法)。您不需要在头文件中重新定义方法签名,您可以通过在子类的实现中实现它来简单地覆盖该函数。例如,如果要覆盖NSView的{​​{1}}方法,则可以在子类的实现中执行以下操作:

drawRect:

当您的课程调用- (void)drawRect:(NSRect)rect //Method signature from the docs { //Code here } 时,您的代码将被执行,而不是drawRect:中的代码。

您还可以在树中传递方法调用,以获取您不想处理的方法。默认情况下这是完成的,所以你不需要创建只在NSView上调用方法的空方法,但是,如果你覆盖一个方法并希望允许你的一个超类首先处理它,你可以做以下内容:

super

如果您想更改类中的变量,这将是有益的,例如,通过首先将方法调用传递给树来提供方法的默认实现。

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

答案 1 :(得分:3)

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