NSTreeController с двумя различными базовыми данными NSManagedObject - PullRequest
2 голосов
/ 26 июня 2011

Я портирую свое приложение iOS на Mac и хочу настроить NSTreeController для управления иерархией объектов.В этой иерархии есть два различных типа NSManagedObject, Группа и Элемент, которые имеют отношение один ко многим (одна Группа ко многим Элементам).Однако у меня возникают проблемы при настройке NSTreeController;Я получаю сообщение об ошибке:

[<NSManagedObject 0x10029c410> valueForUndefinedKey:]: the entity Item is not key value coding-compliant for the key "items".

Похоже, что NSTreeController предназначен для установки с один тип NSManagedObject, чьи дочерние элементы ссылаются на сам и то, что иметь детей в качестве объекта другого типа, не работает.Это правильно?Если так, что мне нужно сделать, чтобы исправить это, сохраняя при этом возможность новой модели данных правильно мигрировать из старой модели данных с помощью облегченной миграции?Если я действительно могу выполнить NSTreeObject с двумя различными типами NSManagedObjects, как мне его настроить?

1 Ответ

2 голосов
/ 27 июня 2011

Все сущности, используемые в NSTreeController, должны отвечать на назначенное дочернее сообщение, как установлено setChildrenKeyPath:. В этом случае это будет items. Другими словами, все ваши объекты в древовидной структуре должны отвечать на сообщение items, даже если у объекта никогда не будет дочерних элементов

например. Предположим, вы хотите смоделировать файловую систему и отобразить ее с помощью NSTreeController. Вы должны иметь модель данных, которая выглядела бы так:

FileSystemObject{
  name:
  parent<<-->FileSystemObject.children
  children<-->>FileSystemObject.parent
}

Folder:FileSystemObject{
}

File::FileSystemObject{
}

Затем вы должны переопределить пользовательский метод для FileSystemObject, который будет возвращать количество детей. Вы должны указать имя метода для NSTreeController с setCountKeyPath:. Переопределите метод в Folder, чтобы вернуть фактическое число детей, и переопределите в File, чтобы вернуть ноль.

Вот почему NSTreeController плохо продуман. В отличие от других контроллеров, он нарушает инкапсуляцию, заставляя вас изменять модель данных в соответствии с потребностями пользовательского интерфейса, что является очень плохой практикой.

Кто-то написал контроллер дерева замены, который просто автоматически предполагает, что любой объект, который не отвечает на ключевой путь потомков, является листом и обеспечивает автоматическое число дочерних элементов, равное нулю. К сожалению, я не могу найти его сейчас и не могу вспомнить, как он назывался.

...