2011-09-22 60 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"); 
}