NSTokenField, представляющий отношение основных данных ко многим

У меня проблема с выяснением того, как представить модель отношений «многие ко многим» в NSTokenField. У меня две (актуальные) модели:

Item Тег

У элемента может быть много тегов, а у тега может быть много элементов. Таким образом, это отношения, обратные ко многим.

Я хотел бы представить эти теги в NSTokenField. Я хотел бы получить поле токенов, автоматически предлагающее совпадения (нашел способ сделать это с помощью tokenfield: completionsForSubstring: indexOfToken: indexOfSelectedItem) и иметь возможность добавлять новые объекты тегов, если они не были сопоставлены с существующим.

Хорошо, надеюсь, ты все еще со мной. Я пытаюсь сделать все это с помощью привязок и контроллеров массивов (поскольку это имеет наибольший смысл, не так ли?)

У меня есть контроллер массива, «Контроллер массива элементов», который привязан к моим делегатам приложения managedObjectContext. Табличное представление, показывающее все элементы, имеет привязку к этому контроллеру массива.

My NSTokenField ' Значение s связано с ключом выбора контроллеров массива и ключом модели path: tags.

В этой конфигурации NSTokenField не будет отображать теги. Это просто дает мне:

<NSTokenFieldCell: 0x10014dc60>: Unknown object type assigned (Relationship objects for {(
    <NSManagedObject: 0x10059bdc0> (entity: Tag; id: 0x10016d6e0 <x-coredata://9D77D47A-1171-4397-9777-706F599D7E3B/Tag/p102> ; data: <fault>)
)} on 0x100169660).  Ignoring...

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

- (NSString *)tokenField:(NSTokenField *)tokenField displayStringForRepresentedObject:(id)representedObject

Проблема в том, что этот метод не вызывается, и я получаю ту же ошибку, что и раньше.

Хорошо, поэтому моим следующим шагом было попробуйте сделать ValueTransformer. Преобразование из массива с тегом сущность -> массив со строками (именами тегов) все было хорошо. Другой способ более сложен.

Я пробовал искать каждое имя в контексте управляемого объекта делегата общего приложения и возвращать соответствующие теги. Это, по-видимому, вызывает у меня проблему с разными контекстами управляемых объектов:

Illegal attempt to establish a relationship 'tags' between objects in different contexts (source = <NSManagedObject: 0x100156900> (entity: Item; id: 0x1003b22b0 <x-coredata://9D77D47A-1171-4397-9777-706F599D7E3B/Item/p106> ; data: {
author = "0x1003b1b30 <x-coredata://9D77D47A-1171-4397-9777-706F599D7E3B/Author/p103>";
createdAt = nil;
filePath = nil;
tags =     (
);
title = "Great presentation";
type = "0x1003b1150 <x-coredata://9D77D47A-1171-4397-9777-706F599D7E3B/Type/p104>";
}) , destination = <NSManagedObject: 0x114d08100> (entity: Tag; id: 0x100146b40 <x-coredata://9D77D47A-1171-4397-9777-706F599D7E3B/Tag/p102> ; data: <fault>))

Где я ошибаюсь? Как мне решить эту проблему? Это вообще правильный подход (мне кажется странным, что вам придется использовать ValueTransformer?)

Заранее спасибо!

7
задан simonwh 8 October 2010 в 16:59
поделиться