2012-08-07 4 views
0

이 특정 키를 관찰하도록 설정하면 아무 일도 일어나지 않습니다. 여기 내가 의미하는 바가있다.NSArrayController - Observing selectionIndex

NSTableView가있는 표준 Cocoa 응용 프로그램이 있는데 어떤 셀을 선택했는지에 따라 이미지보기에 표시된 이미지를 변경하는 방법을 알아 냈습니다.

이제는 선택한 색인으로 버튼을 비활성화/활성화하는 방법을 알아 내려고합니다. 이것이 의미하는 바는 창에 특정 인덱스에서 사용할 수없는 버튼이 있다는 것입니다.

SomeClass의 init 메소드 그러나, 나는이 observeValueForKeyPath 구현할 때

-(id)init { 
    if (self=[super init]) { 
     [arrayController addObserver:self forKeyPath:@"selectionIndex" options:NSKeyValueObservingOptionNew context:NULL]; 
    } 
} 

: 나는 새 인덱스를 선택로 방법을 변경 사항이 포착되지 않습니다. 사실 로깅을 시도하면 콘센트에 (null)이 표시됩니다. 그러나 AppDelegate에서 관찰자를 추가하면 AppDelegate (관찰자로 지정된 경우)가 변경 사항을 선택합니다.

내 일반적인 SomeClass 개체가 어떤 이유가 있습니까? 다른 방법으로해야합니까?

참고 :

나는 다음 윈도우의 소유자 SomeClass을하고,로 awakeFromNib에서 관찰자를 설정하는 NSWindow 표시로 SomeClass를 서브 클래스했는데,이 작동하지만, 그것을 할 나쁜 방법처럼 보인다.

+0

SomeClass에서 어떻게 alloc 초기화를 수행합니까? 또한, "콘센트 쇼 (null)"로 무엇을 의미합니까 - 어떤 콘센트입니까? – rdelmar

+0

SomeClass는 nib 윈도우 (파란색 큐브의 것)와 함께 초기화되고 SomeClass (그리고 심지어 후에)의 인스턴스를 초기화하는 동안 NSLog (@ "% @", arrayController)를 수행하면 인스턴스가 생성됩니다. 나는'(null)'을 얻을 것이다. (arrayController가 콘센트로 설정 됨) –

+1

초기화가 호출되는지 확인 했습니까? 이 클래스의 인스턴스가 코코아 콩 (nib)에서 생성 된 경우 코드를 awakeFromNib에 넣어야합니다. – rdelmar

답변

4

init 방법은 출구가 연결되기 전에 너무 일찍 발생합니다 (제 생각 엔). awakeFromNib에 코드를 넣으면 올바르게 작동합니다.

펜촉 로딩 인프라가 펜촉 아카이브에서 다시 각 개체에 awakeFromNib 메시지를 보내지 만, 아카이브 후에 만 ​​ 모든 개체가로드 된과 :이 NSObject 클래스 참조에 애플의 문서에서입니다 초기화 됨. 개체가 awakeFromNib 메시지를 받으면 의 모든 콘센트 및 작업 연결이 이미 설정되어 있어야합니다.

+0

이제 NSWindow의 자손으로 SomeClass를 서브 클래스 화하고 거기에서 작업하는 것이 나쁜 아이디어인지 궁금해하고 있습니다. 다행히 지금은 괜찮지 만 내 NSTableView에서 빈 셀을 클릭하면 프로그램이 충돌합니다 (범위를 벗어났습니다.) 내 관찰 메소드는 SomeClass * object = [someArray objectAtIndex : [arrayController selectionIndex] 행을 따라 무언가를합니다. ]'. 해결 방법이 있습니까? –

관련 문제