2009-12-30 3 views
0

У меня есть NSTreeController, массив которого привязан к свойству "items" (custom) подкласса NSArrayController. Поскольку контроллер дерева не связан с выбором NSArrayController, мне нужно убедиться, что контроллер дерева знает, что элементы должны быть извлечены после изменения выбора контроллера массива.NSTreeController KVO issue

Я сделал следующее в подклассе 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

Элемент является обычным свойством моего подкласса NSArrayController. Он также является свойством класса, которым управляет NSArrayController. Я не могу связать напрямую, поскольку мне нужно сделать некоторую дополнительную логику, которая не может быть обработана классом, которым управляет контроллер массива. – diederikh

+1

Я бы рекомендовал размещать соответствующие части вашего пользовательского кода. Слишком много угадывания необходимо, поскольку детали отсутствуют. –

Смежные вопросы