2011-09-22 21 views
2

我的NSOutlineView outlineViewSelectionDidChange方法將不會被調用。 I SET設置NSOutlineViews委託其中其它方法如NSOutlineView outlineViewSelectionDidChange

- (BOOL)outlineView:(NSOutlineView *)outlineView isItemExpandable:(id)item 

存在的類。但是,在選擇項目時不會調用outlineViewSelectionDidChange。 有人有想法嗎?

回答

0

此通知有點奇怪,因爲它不會自動轉發給代表。嘗試添加一個明確登記您的初始化代碼,像這樣的例子:

- (void)windowControllerDidLoadNib:(NSWindowController *)aController; 
{ 
    [super windowControllerDidLoadNib:aController]; 
    NSNotificationCenter * center = [NSNotificationCenter defaultCenter]; 
    [center addObserver:self 
       selector:@selector(outlineViewSelectionDidChange:) 
        name:@"NSOutlineViewSelectionDidChangeNotification" 
       object:outlineView]; 
} 
+0

你的代碼看起來很有希望,但不幸的是,這對我不起作用。我將NSNotifactionCenter添加到我的應用程序委託中的applicationDidFinishLaunching方法中,但不會調用outlineViewSelectionDidChange。 – crizztus

+0

您是否有IB中填寫的IBOutlet,並指向您的大綱視圖?你是否在註冊通知時將它作爲object:參數傳遞?雖然下面實現的子類化方法可能會起作用,但a)它不是Cocoa中的首選技術,並且b)比推薦的方法更多的工作。 –

+0

當您只需要正確設置代理時,您不需要設置額外的觀察者。 –

1

好吧, 同時,我想通了,在「NSOutlineViewSelectionDidChangeNotification」將只在通知對象被拋出。所以我不得不繼承我的NSOutlineView來捕獲通知並將它傳遞給我需要它的對象。

1

你自己的觀點需要符合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)viewDidLoadmyoutlineview需求來設定自己的代表與

[myoutlineview setDelegate:self]; 

使自己的視圖可以知道從哪裏選擇調用它的通知方法triggerd等。因此,您可以將通知邏輯放置在符合此協議的相同View類中。

-(void)outlineViewSelectionDidChange:(NSNotification *)notification { 
    NSLog(@"selection did change"); 
}