你自己的观点需要符合NSOutlineViewDelegate协议,像这样..
@interface MyOutlineViewController : NSView <NSOutlineViewDataSource,NSOutlineViewDelegate> {
IBOutlet NSOutlineView *myoutlineview;
}
@end
,你会在你的执行
-(NSInteger)outlineView:(NSOutlineView *)outlineView numberOfChildrenOfItem:(id)item;
-(BOOL)outlineView:(NSOutlineView *)outlineView isItemExpandable:(id)item;
-(id)outlineView:(NSOutlineView *)outlineView child:(NSInteger)index ofItem:(id)item;
-(id)outlineView:(NSOutlineView *)outlineView objectValueForTableColumn:(NSTableColumn *)tableColumn byItem:(id)item;
这个方法,你设置你的outlineview。 当加载这个视图-(void)viewDidLoad
被调用,你的预定义的nib/xib文件或手动调用将根据你的逻辑设置你的数据源来填充它。
现在,在您-(void)viewDidLoad
您myoutlineview
需求来设定自己的代表与
[myoutlineview setDelegate:self];
使自己的视图可以知道从哪里选择调用它的通知方法triggerd等。因此,您可以将通知逻辑放置在符合此协议的相同View类中。
-(void)outlineViewSelectionDidChange:(NSNotification *)notification {
NSLog(@"selection did change");
}
你的代码看起来很有希望,但不幸的是,这对我不起作用。我将NSNotifactionCenter添加到我的应用程序委托中的applicationDidFinishLaunching方法中,但不会调用outlineViewSelectionDidChange。 – crizztus
您是否有IB中填写的IBOutlet,并指向您的大纲视图?你是否在注册通知时将它作为object:参数传递?虽然下面实现的子类化方法可能会起作用,但a)它不是Cocoa中的首选技术,并且b)比推荐的方法更多的工作。 –
当您只需要正确设置代理时,您不需要设置额外的观察者。 –