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 также есть некоторая документация и пример кода для этого.

Другие вопросы по тегам