2

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

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

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

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

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

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

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

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

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

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

ответ

2

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

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

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

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

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

+0

Я думаю, что это является ответом для меня, однако я не могу получить предикат права. Вы использовали CONTAINS, но это для строк, не так ли? Я пытался использовать IN, но не могу получить радость, потому что я предикат noob. Я думаю, мне нужно что-то вроде [sheetUsersAC setFetchPredicate: [NSPredicate predicateWithFormat: @ "NOT% @ IN groups", [groupsAC selection]]], но это не работает. Так близко ... – swampf0etus

+0

Да, вы правы: 'CONTAINS' только для строк. Виноват. Я думаю, что '' NONE groups ==% @ "' должны работать. –

+0

Наконец-то взломал! Я не понял, что выбор возвращает прокси-объект, а не исходный объект. Чтобы получить исходный объект из выделения, мне пришлось использовать valueForKey: @ "self". Как только я понял это, я обнаружил, что могу использовать «NONE groups ==% @» или «NOT% @ IN groups»: '[sheetUsersAC setFetchPredicate: [NSPredicate predicateWithFormat: @" NOT% @ IN groups ", [[groupsAC selection] valueForKey: @ "я"]]] ' – swampf0etus

1

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

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

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

0

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

Смежные вопросы