2011-09-22 3 views
2

내 NSOutlineView outlineViewSelectionDidChange 메서드가 호출되지 않습니다. I는 NSOutlineView outlineViewSelectionDidChange

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

같은 다른 방법이 존재 클래스에 NSOutlineViews 대리자 세트. 그러나 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을 가지고 있으며 개요보기를 가리 킵니까? 그리고 그것을 객체로 전달할 것인가? 통지를 등록 할 때 매개 변수? 아래에서 구현 한 서브 클래 싱 방식이 효과가 있지만, a) 코코아에서 선호하는 기술이 아니며, b) 권장되는 방식보다 훨씬 많은 작업이 필요합니다. –

+0

대리인을 올바르게 설정해야 할 때 추가 관찰자를 설치하지 않아도됩니다. –

1

좋아, 는 그 사이에 나는 "NSOutlineViewSelectionDidChangeNotification는"단지 통지 객체 내 던질 것을 알아 냈다. 그래서 NSOutlineView를 서브 클래스 화하여 알림을 잡아서 필요한 곳에 객체를 전달해야했습니다.

1

자신 만보기

@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; 

이 방법이있을 것이다 .. 그래서 같은 NSOutlineViewDelegate 프로토콜을 준수해야하는 위치를 설정하여 outlineview합니다. 이 뷰를로드 할 때 -(void)viewDidLoad이 호출되고 사전 정의 된 nib/xib 파일 또는 수동 호출이 로직에 따라 데이터 소스를 채울 수 있도록 설정합니다. 그래서 선택에서의 알림 방법의 triggerd를 호출하고 어디 -(void)viewDidLoad 당신의 myoutlineview 요구에 지금

때문에 자신의보기 알 수

[myoutlineview setDelegate:self]; 

와 함께 자신의 대리자를 설정합니다. 따라서 알림 로직을이 프로토콜을 준수하는 동일한 View 클래스에 배치 할 수 있습니다.

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