NSTreeController с двумя различными базовыми данными NSManagedObject

Я портирую свое приложение 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 ответ

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

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

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

Folder:FileSystemObject{
}

File::FileSystemObject{
}

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

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

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

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