У меня есть древовидная модель, которую я хотел бы показать в NSOutlineView с помощью NSTreeController.
Мне удалось настроить привязки, и все работает нормально, пока я использую функции вставки и удаления NSTreeController для изменения дерева модели. Если я попытаюсь вставить или удалить из дерева модели напрямую, в некоторых случаях NSOutlineView не обновляется.
Если я вставляю объект в расширенную группу объектов, это работает:
Но если я пытаюсь добавить первый объект в узел, у которого до этого не было дочерних элементов, ничего не происходит. Треугольник раскрытия не отображается, поэтому я не могу развернуть его, чтобы увидеть новый узел.
Если я наведу курсор на этот узел с новым объектом, он расширится, и я смогу без проблем добавить второго потомка.Но треугольник по-прежнему невидим:
Наконец, если я закрываю родителя всех этих узлов и открываю их снова (запуская перезагрузку), треугольник внезапно появляется:
Вот почему мне было интересно, придется ли мне вручную перезагружать 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"];
}