NSArrayControllers и гетерогенные массивы объектов Core Data - PullRequest
2 голосов
/ 20 июня 2011

Я пытаюсь создать приложение Mac OS Core Data, которое имеет массив родительских объектов (называемых уровнями), каждый из которых содержит коллекцию дочерних объектов (называемых блоками) через отношение один ко многим. У меня есть табличное представление, успешно управляющее массивом уровней, и пользовательский объект представления, который рисует блоки графически на основе позиций, сохраненных в свойствах x и y моего класса модели Block. Я могу добавить блоки к текущему выбранному уровню, удалить их, выбрать и переместить их в пользовательском представлении и привязать текстовые поля к различным другим свойствам класса Block, которые я могу использовать для редактирования этих значений. Вся эта информация успешно сохраняется и восстанавливается в хранилище основных данных и из него, без проблем, выводимых в отладчик. Замечательно. Я использовал NSArrayController для уровней и другой для блоков, который привязан к текущему выбору контроллера массива уровней, в том, что я прочитал, это довольно стандартный способ.

Теперь мой класс Block на самом деле является абстрактным классом, и я на самом деле создаю экземпляры различных дочерних классов Block (например, RedBlock, GreenBlock, BlueBlock классы). Каждый подкласс имеет отдельный набор свойств, которые применяются только к этому типу блока (поэтому RedBlock имеет свойство «текст», которого нет ни у одного другого, BlueBlock имеет целочисленное свойство «значение» и т. Д.). Я хочу создать инспектор, который будет меняться в зависимости от типа блоков, которые в данный момент выбраны в моем настраиваемом представлении. Чтобы попробовать это, прежде чем я начну создавать подпредставления для каждого типа Bock, я создал текстовое поле, которое я хочу привязать к выбранному в данный момент свойству «text» RedBlock, предпочтительно ничего не показывая, когда выбраны блоки других типов. Вот где я застрял. Я добавил еще один NSArrayController в режиме Entity с указанием RedBlock в качестве его типа, чтобы я мог привязать свойство «text», и попытался добавить предикат фильтра, основанный на типе класса. Я также пробовал различные другие конфигурации и привязки, но я либо получаю исключения, либо искажаю значения в текстовом поле, которое привязываю к этому контроллеру, или другие странные ошибки и общие ошибки.

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

Итак, мой вопрос - правильно ли я поступаю? Должен ли я пытаться создать NSArrayController, который как-то фильтрует выбранные элементы в моем контроллере массива Blocks? Если так, то это должно быть просто или есть какой-то трюк, который я пропустил? Если нет, то как лучше всего это сделать?

1 Ответ

0 голосов
/ 17 августа 2011

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

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

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

...