我在弄清楚如何在 NSTokenField 中表示多对多关系模型时遇到问题。我有两个(相关)模型:
物品标签
一个项目可以有很多标签,一个标签可以有很多项目。所以这是一个反多对关系。
我想做的是在 NSTokenField 中表示这些标签。我想最终得到一个自动建议匹配项的标记字段(找到了一种使用 tokenfield:completionsForSubstring:indexOfToken:indexOfSelectedItem 的方法),并且如果它与现有标记实体不匹配,则能够添加新标记实体。
好吧,希望你还在我身边。我正在尝试使用绑定和数组控制器来完成所有这些工作(因为这是最有意义的,对吧?)
我有一个数组控制器“项目数组控制器”,它绑定到我的应用程序委托 managedObjectContext。显示所有项目的 tableview 绑定到此数组控制器。
我的 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 很奇怪?)
提前致谢!