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