У меня проблема с выяснением того, как представить модель отношений «многие ко многим» в NSTokenField. У меня есть две (соответствующие) модели:
Пункт
Тэг
Элемент может иметь много тегов, а тег может иметь много элементов. Так что это обратное отношение ко многим.
То, что я хотел бы сделать, это представить эти теги в NSTokenField. Я хотел бы закончить с токеном, автоматически предлагающим совпадения (нашел способ сделать это с помощью tokenfield: завершенийForSubstring: indexOfToken: indexOfSelectedItem) и возможностью добавлять новые теги, если они не были сопоставлены с существующим. *
Хорошо, надеюсь, ты все еще со мной. Я пытаюсь сделать все это с помощью привязок и контроллеров массива (так как это имеет смысл, верно?)
У меня есть контроллер массива "Item Array Controller", который привязан к делегатам моего приложения managedObjectContext. Таблица, показывающая все элементы, имеет привязку к этому контроллеру массива.
Значение моего NSTokenField имеет привязку к ключу выбора контроллеров массива и пути ключа модели: теги.
С этим конфигом 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?)
Заранее спасибо!