Я работаю над приложением, которое имеет точно такое же поведение, и вот как я это делаю:
У меня есть 5 основных сущностей в моей базовой модели данных:
AbstractItem
- абстрактная сущность, которая имеет атрибуты, общие для всех элементов, такие как имя
, вес
и редактируемый
. Также имеет два отношения: родительский
(отношение к одному к AbstractItem
) и потомки
(отношение ко многим к AbstractItem
и инверсия родительского
). Группа
- конкретный дочерний объект AbstractItem
. Папка
- конкретный дочерний объект AbstractItem
. Добавляет отношение «многие ко многим» к базовому объекту Item
. SmartFolder
- конкретный дочерний объект папки
. Добавляет двоичный атрибут predicateData
. Переопределяет аксессор отношения "items" папки папки
, чтобы возвращать результаты выполнения запроса выборки с предикатом, определенным атрибутом predicateData
. DefaultFolder
- конкретный дочерний объект из SmartFolder
. Добавляет строковый атрибут идентификатор
. Для элементов раздела «Библиотека» я вставляю объекты DefaultFolder
и даю им уникальный идентификатор, чтобы я мог легко их извлекать и различать их. Я также даю им NSPredicate
, который соответствует тому, что Items
они должны показывать. Например, «Музыка» DefaultFolder
будет иметь предикат для получения всех музыкальных элементов, «Подкасты» DefaultFolder
будут иметь предикат для получения всех элементов подкастов и т. Д.
Элементы корневого уровня (" Library "," Shared "," Store "," Genius "и т. Д.) - это элементы Group
с родителем nil
. Для групп и папок, которые нельзя редактировать, их атрибут editable
установлен на NO
.
Что касается фактического получения этого материала в вашем outlineView, вам необходимо реализовать ] NSOutlineViewDataSource
и NSOutlineViewDelegate
протоколируются самостоятельно. Здесь просто слишком много поведенческой сложности, чтобы выкачать ее через NSTreeController
. Однако в моем приложении
Не добавляйте чушь в свой набор данных просто для поддержки представления. Это не только идет вразрез с шаблоном проектирования MVC, но и добавляет ненужную сложность (то есть «больший потенциал для ошибок») к единственной наиболее важной части: управлению пользовательскими данными.
Тем не менее, использование привязок в этом конкретном сценарии является причиной столько трения. Почему бы не отказаться от привязок полностью? Я думаю, вы на правильном пути, используя протокол NSOutlineViewDataSource, но вы не зашли достаточно далеко. Вместо этого полностью полагайтесь на этот (все еще совершенно действующий и в некотором смысле превосходный) протокол.
Вы бы по сути обменяли простоту настройки (и легкость уведомления об изменениях) на полный контроль над древовидной структурой.