你自己的觀點需要符合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)比推薦的方法更多的工作。 –
當您只需要正確設置代理時,您不需要設置額外的觀察者。 –