2009-12-30 5 views
0

NS 配列의 하위 항목의 "항목"(사용자 지정) 속성에 바인딩 된 NSTreeController가 있습니다. 트리 컨트롤러가 NSArrayController 선택에 바인딩되지 않았으므로 어레이 컨트롤러가 변경된 후에 항목을 가져와야한다는 것을 트리 컨트롤러에 알려야합니다.NSTreeController KVO 발행

내가 NSArrayController의 서브 클래스에서 다음을 수행 한 :

+ (NSSet *)keyPathsForValuesAffectingItems 
{ 
    return [NSSet setWithObjects:@"selectedObjects",nil]; 
} 

충분한 AFAIK해야한다. 클래스 메서드가 호출되었지만 아무런 영향을 미치지 않는 것 같습니다. 내가 selectedObjects에 대한 관찰자를 구현하는 경우

는 그것을 잘 작동합니다 :

- (void)awakeFromNib; 
{ 
    [self addObserver:self forKeyPath:@"selectedObjects" options:0 context:nil]; 
} 

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(NSObjectController *)context; 
{ 
    if ([keyPath isEqual:@"selectedObjects"]) { 
     [self willChangeValueForKey:@"items"]; 
     [self didChangeValueForKey:@"items"]; 
    } 

    [super observeValueForKeyPath:keyPath ofObject:object change:change context:context]; 
} 

어떤 단서?

답변

0

먼저 "항목"은 NSArrayController의 관찰 가능한 속성이 아닙니다. 어레이 컨트롤러가 컬렉션을 관리하는 클래스의 속성을 의미합니까? 즉, Foo의 배열을 관리하고 Foo는 속성 "items"를 보유하고 있습니까?

어쨌든 이것을 어렵게 만듭니다. 트리 컨트롤러의 내용을 어레이 컨트롤러의 selection.items 경로에 바인드하지 않는 것이 어떻습니까? 이것이 불가능한 경우는 거의 없습니다.

+0

items는 NSArrayController 하위 클래스의 사용자 지정 속성입니다. 또한 NSArrayController가 관리하는 클래스의 속성이기도합니다. 배열 컨트롤러가 관리하는 클래스에서 처리 할 수없는 몇 가지 추가 논리를 수행해야하므로 직접 바인딩 할 수 없습니다. – diederikh

+1

사용자 지정 코드의 관련 부분을 게시하는 것이 좋습니다. 세부 정보가 누락되었으므로 너무 많은 추측이 필요합니다. –