Все сущности, используемые в NSTreeController, должны отвечать на назначенное дочернее сообщение, как установлено setChildrenKeyPath:
. В этом случае это будет items
. Другими словами, все ваши объекты в древовидной структуре должны отвечать на сообщение items
, даже если у объекта никогда не будет дочерних элементов
например. Предположим, вы хотите смоделировать файловую систему и отобразить ее с помощью NSTreeController. Вы должны иметь модель данных, которая выглядела бы так:
FileSystemObject{
name:
parent<<-->FileSystemObject.children
children<-->>FileSystemObject.parent
}
Folder:FileSystemObject{
}
File::FileSystemObject{
}
Затем вы должны переопределить пользовательский метод для FileSystemObject
, который будет возвращать количество детей. Вы должны указать имя метода для NSTreeController с setCountKeyPath:
. Переопределите метод в Folder
, чтобы вернуть фактическое число детей, и переопределите в File
, чтобы вернуть ноль.
Вот почему NSTreeController плохо продуман. В отличие от других контроллеров, он нарушает инкапсуляцию, заставляя вас изменять модель данных в соответствии с потребностями пользовательского интерфейса, что является очень плохой практикой.
Кто-то написал контроллер дерева замены, который просто автоматически предполагает, что любой объект, который не отвечает на ключевой путь потомков, является листом и обеспечивает автоматическое число дочерних элементов, равное нулю. К сожалению, я не могу найти его сейчас и не могу вспомнить, как он назывался.