При использовании NSTreeController нужно ли вручную перезагружать NSOutlineView при изменении массива модели?

У меня есть древовидная модель, которую я хотел бы показать в NSOutlineView с помощью NSTreeController.

Мне удалось настроить привязки, и все работает нормально, пока я использую функции вставки и удаления NSTreeController для изменения дерева модели. Если я попытаюсь вставить или удалить из дерева модели напрямую, в некоторых случаях NSOutlineView не обновляется.

Если я вставляю объект в расширенную группу объектов, это работает:

Inserting node

New node showing

Но если я пытаюсь добавить первый объект в узел, у которого до этого не было дочерних элементов, ничего не происходит. Треугольник раскрытия не отображается, поэтому я не могу развернуть его, чтобы увидеть новый узел.

Inserting new child

enter image description here

Если я наведу курсор на этот узел с новым объектом, он расширится, и я смогу без проблем добавить второго потомка.Но треугольник по-прежнему невидим:

enter image description here

Наконец, если я закрываю родителя всех этих узлов и открываю их снова (запуская перезагрузку), треугольник внезапно появляется:

enter image description here

Вот почему мне было интересно, придется ли мне вручную перезагружать NSOutlineView's строки, чтобы треугольник был виден, или я что-то напутал? Спасибо!!

ОБНОВЛЕНИЕ:

В моем классе Node я добавляю новый дочерний элемент следующим образом:

- (void)addChild:(MyNode *)child {
    [self willChangeValueForKey:@"childNodes"];
    [children addObject:child];
    [self didChangeValueForKey:@"childNodes"];
}

И я также реализовал их (которые я установил в IB для своего NSTreeController):

- (NSArray *)childNodes {
    return [NSArray arrayWithArray:children];
}

- (NSInteger)countOfChildNodes {
    return [children count];
}

- (BOOL)nodeIsLeaf {
    return [children count] < 1;
}

Я знаю, что это (особенно ] childNodes) не очень оптимизированы, но на данный момент я только экспериментирую, так как в окончательной версии мои дочерние элементы будут храниться в массиве C.

ОБНОВЛЕНИЕ 2:

Я также пытался отправлять уведомления KVO для двух других свойств, но это тоже не помогло.

- (void)addChild:(MyNode *)child {
    NSLog(@"%@", NSStringFromSelector(_cmd));
    [self willChangeValueForKey:@"nodeIsLeaf"];
    [self willChangeValueForKey:@"countOfChildNodes"];
    [self willChangeValueForKey:@"childNodes"];
    [children addObject:child];
    [self didChangeValueForKey:@"childNodes"];
    [self didChangeValueForKey:@"countOfChildNodes"];
    [self didChangeValueForKey:@"nodeIsLeaf"];
}
8
задан DrummerB 10 May 2012 в 11:07
поделиться