У меня возникли проблемы с выяснением того, как представить модель отношения «многие ко многим» в NSTokenField. У меня есть два (соответствующая) модель:NSTokenField, представляющий отношение Core Data to-many
Элемент Tag
Элемент может иметь много тегов и тег может иметь много вещей. Так что это отношение обратное к многим.
Что я хотел бы сделать, это представить эти теги в NSTokenField. Я бы хотел, чтобы в конечном итоге поле tokenfield автоматически предложило совпадения (выяснил способ сделать это с помощью tokenfield: completionsForSubstring: indexOfToken: indexOfSelectedItem) и возможность добавлять новые теги, если он не был сопоставлен с существующим.
Хорошо, надеюсь, что вы все еще со мной. Я пытаюсь сделать все это с привязками и контроллерами массивов (так как это имеет смысл, верно?)
У меня есть контроллер массива «Контроллер массива элементов», который привязан к моим делегатам приложений 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. Преобразование из массива с тегом entity -> array со строками (имена тегов) было хорошим. Другой путь более сложный.
То, что я пробовал, состоит в том, чтобы искать каждое имя в контексте объекта управляемого объекта делегирования приложения и возвращать соответствующие теги. Это, по-видимому, вызывает проблему с различными контекстами управляемых объектов:
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?)
Заранее спасибо!
Я потратил еще некоторое время на изучение этого сегодня - до сих пор не могу найти ресурсы, объясняющие это. Надеюсь, кто-то придет на помощь здесь! :) – simonwh