2013-02-25 56 views
10

如何将NSArrayController的内容绑定到有序对多关系中的实体?使用NSArrayController绑定有序关系

我在我的核心数据模型中有一个无序的一对多关系,并且一个NSArrayController的内容集与父实体的关系绑定在一起。这工作正常,数据可以从NSArrayController访问,没问题。

我在开发过程中决定允许用户手动重新排序这些子对象会更好,因此我将关系更改为有序对象。现在,正在从我的笔尖创建我的NSArrayController的时候,提出了以下错误:

Cannot create NSSet from object Relationship '...' fault on managed object ... of class _NSFaultingMutableOrderedSet 

现在实际上,我认为这一切是有道理的:这是一个有序的关系,所以现在我发现了一个有序集合。将它绑定到Content Array也是不合适的,因为它现在是一个NSOrderedSet,而不是一个数组。我的问题是:现在我该如何将这个关系的数据绑定回NSArrayController?

+0

我也遇到过这个问题,我相当确信这是一个错误'NSArrayController' - 提交了一个错误报告。 – Vervious 2013-03-24 01:47:54

+0

看来,根据Hal的答案中提到的解决方法,真的没有人有一种“真实”的方式来绑定它。我也会做一个错误报告,因为它应该是一个showstopper,解决方法或不。 – Khakionion 2013-03-25 06:09:47

回答

8

根本问题是核心数据有序对多关系返回一个NSOrderedSet,而NSOrderedSet不是NSSet的子类。任何期望NSSet的阵列控制器绑定都会失败。

Tom Fewster有一个detailed blog post描述使用NSValueTransformer来解决这个缺点,在NSOrderedSet和NSArray之间进行转换。他还提供了一个sample implementation on Github

+0

谢谢!正如我在问题的最后一段所指出的那样,我知道NSSet的继承(而不是缺乏)是目前所存在的绑定问题。但是这种价值转换方法是一种拯救生命的方式!我一定会看看它。 – Khakionion 2013-03-25 06:07:55

+3

解决方法(我认为)的问题是不会使用可变访问器,这意味着任何更改都意味着重新分配/重新整理整个集合。 – Vervious 2013-03-26 21:11:45

9

我在搜索过程中看到这个讨论是否有任何新的发展。在运输应用程序中,我目前将阵列控制器的内容数组绑定到[email protected],它工作得很好,不知道我是否发现自己或者其他人在某处推荐它。

+0

这显然是解决方案。 – Altimac 2013-11-30 05:20:53

+2

我不确定这是否是解决方案,因为“数组”操作符调用NSOrderSet的“数组”方法,该方法返回一个“外观”数组对象,该数据对象在设计中是不可变的(请参阅NSOrderSet.h中的头文件doc )。这意味着,NSArrayController可以“绑定”,但无法对NSOrderedSet进行任何更改。这不过是中途绑定。只读解决方案。 – 2014-03-28 05:52:40

+0

的确相当确实。如果你需要可变性,这将会失败。接得好;) – Altimac 2014-08-14 11:56:42

相关问题