NSTreeController не отвечает на reloadData
У меня есть NSTreeController с привязками к классу.
NSOutlineView dirTree связывается с NSTreeController
В частности, содержимое структуры Outline привязывается к вещественным объектам
Это, кажется, работает хорошо, но я в своем уме, чтобы выяснить, почему он не отвечает на reloadData.
Ключевыми путями NSTreeController являются:-
Children subDirectories
Count numberOfSubDirs
Они перечислены ниже; numberOfSubDirs возвращает простое количество подкаталогов (с добавленным диагностическим отображением).
- (NSArray *)subDirectories {
if (subDirectories == nil) {
[self loadSubDirectories];
}
return subDirectories;
}
- (NSInteger)numberOfSubDirs {
NSArray *tmp = [self subDirectories];
NSLog(@"numberOfSubDirs %@ %d", [self relativePath], [tmp count]);
return [tmp count];
}
Если я вызываю функцию обновления, которая обновляет данные, то вызывает [dirTree reloadData]; Я получаю следующий вывод:-
Reload Data
numberOfSubDirs Shared 7
numberOfSubDirs Adobe 1
numberOfSubDirs bZTree2 0
numberOfSubDirs Ian Documents 25
numberOfSubDirs Library 1
numberOfSubDirs NET 1
numberOfSubDirs TSA 12
numberOfSubDirs Wacom 1
Если я удаляю каталог (внешне в Finder) и вызываю функцию обновления, я получаю следующий вывод:
Reload Data
numberOfSubDirs Shared 6
numberOfSubDirs Adobe 1
numberOfSubDirs bZTree2 0
numberOfSubDirs Ian Documents 25
numberOfSubDirs Library 1
numberOfSubDirs NET 1
numberOfSubDirs TSA 12
numberOfSubDirs Wacom 1
NSTreeController вызывает numberOfSubDirs родительского элемента "Shared" и правильно говорит, что теперь у него 6 подкаталогов.
Однако затем он запрашивает 7 подкаталогов, включая удаленный элемент "bZTree2", и не обновляет отображение, чтобы показать только 6 существующих.
1 ответ
NSTreeController
не отвечает на -reloadData
потому что он не реализует этот метод. Вы получите и исключение времени выполнения, и предупреждение компилятора, если попытаетесь вызвать его на NSTreeController
пример.
NSOutlineView
отвечает на -reloadData
, но это ничего не сделает, если NSOutlineView
использует источник данных. Если вы используете NSTreeController
это ничего не сделает вообще.
Поскольку создается впечатление, что вы создаете представление файловой системы, я настоятельно рекомендую вам использовать маршрут источника данных, а не использовать NSTreeController
, это избавит вас от многих проблем.
У Apple также есть некоторая документация и пример кода для этого.