Использование NSArrayController без Core Data - PullRequest
2 голосов
/ 19 марта 2012

Я использую Core Data в своем приложении OS X, где у меня есть некоторые TableViews, связанные с NSArrayControllers. Проблема в том, что я пытаюсь заполнить табличное представление на листе, используя контроллер массива, где я не хочу, чтобы содержимое сохранялось.

Вот как приложение висит вместе;

Окно 1 - показывает список пользователей в табличном представлении и позволяет добавлять и удалять пользователей. Содержимое сохраняется через привязки Core Data.

Окно 2 - показывает список групп в табличном представлении. Второе табличное представление показывает список пользователей, которые принадлежат к выбранной группе. Содержание сохраняется через привязки Core Data. Кнопка «добавить пользователей» вызывает лист для добавления пользователей в группу.

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

Итак, у меня проблема с контроллером массива для листа Add Users. Когда я вызываю лист, я перебираю всех пользователей и добавляю их к контроллеру массива, если они еще не существуют в группе. Когда я закрываю лист, я пытаюсь очистить контроллер массива, используя removeObject: но это приводит к тому, что «нельзя использовать этот метод с ModelObjectContect».

Зачем мне MOC для удаления элементов из контроллера массива? Это только для демонстрации, поэтому мне не нужно, чтобы оно сохранялось. Если я установлю для контроллеров массива MOC значение моего делегата приложения, это физически удалит пользователей, чего я явно не хочу. Я просто хочу удалить их из табличного представления листа.

Я подумал, что ответом может быть создание другого MOC для использования в качестве блокнота, а не привязка его к постоянному хранилищу, однако это просто дало мне другую ошибку при использовании removeObject :, что-то вроде «can» t удалить объекты, которые существуют в другом MOC. "

Почему мне разрешено добавлять объекты в контроллер массива, но не удалять их? В тех случаях, когда вы на самом деле не хотите, чтобы элементы были физически удалены, вы должны получить доступ к базовому «контенту», например, [содержимое контроллера массива]? Я играл с этим, но получаю странные результаты отображения, поскольку кажется, что он играет с контентом контроллера массива за его спиной. Если я сделаю это, есть ли способ сообщить контроллеру массива «кстати, я возился с вашим контентом, и вам, возможно, понадобится собраться»?

Мне кажется, что вы не должны использовать контроллеры массива без Core Data, но в документации есть множество комментариев, которые предполагают, что они работают с основными данными и без них.

Ответы [ 3 ]

2 голосов
/ 19 марта 2012

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

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

Но есть более простое решение.Я предлагаю вам установить контекст управляемого объекта контроллера массива для вашего основного MOC и использовать предикат для фильтрации его содержимого.

[arrayController setPredicate:[NSPredicate predicateWithFormat:@"NONE groups == %@", group]];

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

1 голос
/ 19 марта 2012

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

Мне не понятно, почему вы создаете объекты, а не просто используете запрос на выборку?

Вы не говорите, как добавляете «пропавших» пользователей, но если это просто базовый список, вы можете рассмотреть возможность создания массива прокси-объектов (то есть вы не трогаете MOC), который вы можете отбросить, когда лист готов. Вы можете использовать для этого неосновной контроллер массива данных или просто (задыхаться!) Вообще не использовать привязки и делать это по старинке.

0 голосов
/ 04 марта 2013

Почему бы не использовать [arrayController setContent: nil]

...