2012-05-07 4 views
3

Я пытаюсь подключить NSOutlineView на основе представления к моей модели с помощью NSTreeController и привязок.NSOutlineView не обновляется

Моя модель состоит из основного класса узла (и его подклассов). У каждого узла может быть 0 или более детей. Я сохраняю детей в массиве C (объектов Node) по соображениям производительности. Я определил childrenKeyPath, countKeyPath и leafKeyPath свойства моего NSTreeController и реализовали их в своем классе Node:

- (NSArray *)childNodes { 
return [NSArray arrayWithObjects:children_ count:childCount_]; 
} 

- (BOOL)nodeIsLeaf { 
    return childCount_ < 1; 
} 

- (NSUInteger)childCount { 
    return childCount_; 
} 

При добавлении нового ребенка, я называю [self willChangeValueForKey:@"childNodes"] до и [self didChangeValueForKey:@"childNodes"] после вставки его в массив C.

Я установил привязки, как описано в документации. (я связала Content Object из NSTreeController в мой корневой узел. Я связала содержание NSOutlineView к arrangedObjects в NSTreeController в. Я также связывал NSTextField собственности objectValue.name в NSTableViewCell в)

начальной конфигурации (корень объект и его дети) загружается нормально при запуске приложения. Я также могу добавить новых детей к корневому объекту.

Однако, когда я пытаюсь добавить нового ребенка к любому узлу (за исключением root), у которого еще нет дочерних элементов (без треугольника раскрытия), NSOutlineView не обновляется (все еще нет треугольника). Новый узел правильно вставляется в модель и отправляются сообщения will/didChangeValue, но NSTreeController не беспокоится о рассмотрении нового дочернего массива. В этом случае запись 3 основных функций KeyPath не печатает ничего.

Если я закрываю родительский элемент и разворачиваю его снова, то узлы перезагружаются, отображается треугольник раскрытия, и я могу развернуть узел, чтобы увидеть новый узел, который я только что добавил. Почему NSTreeController не проверяет изменения, даже если я отправил сообщения KVO при изменении массива children?

+0

Насколько я могу судить, это ошибка в NSOutlineView, основанной на представлении. В NSTableRowView, который находится на месте в этом месте, отсутствует соответствующая надстройка кнопки. Когда вы сворачиваете и повторно расширяете родительский элемент в проблемную строку, представление схемы повторно создает представление строки и правильно добавляет отсутствующую кнопку. Необходимо обходное решение для программного принуждения представления схемы для воссоздания этого представления строки без необходимости делать какие-либо другие визуальные изменения. –

ответ

0

ОК это сделать:

/* item is the item which has just had new children added */ 
[_outlineView reloadItem:[_outlineView parentForItem:item] reloadChildren:YES]; 

Это может быть неэффективным, и она даже может быть установлен в Mountain Lion, но это работает для меня. Вы можете ограничить время, необходимое для этого, когда элемент, когда от 0 до> 1 ребенка (и наоборот?).

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