使用没有核心数据的NSArrayController

时间:2012-03-19 18:01:53

标签: objective-c core-data nsmanagedobjectcontext nsarraycontroller

我在OS X应用程序中使用Core Data,我将一些TableView绑定到NSArrayControllers。我遇到的问题是当我尝试使用数组控制器在工作表中填充tableview时,我不希望内容持续存在。

这是应用程序挂起的方式;

窗口1 - 在表格视图中显示用户列表,并允许添加和删除用户。内容通过Core Data绑定持久存在。

窗口2 - 在表格视图中显示组列表。第二个表视图显示属于所选组的用户列表。内容通过Core Data绑定持久存在。 “添加用户”按钮会调用工作表以将用户添加到组中。

添加用户工作表 - 此工作表显示的用户表格视图不是所选组的成员。按工作表上的关闭按钮可将所选用户添加到所选组。

好的,我遇到的问题是添加用户表的阵列控制器。当我调用工作表时,我遍历所有用户并将其添加到数组控制器(如果它们尚未存在于组中)。当我关闭工作表时,我尝试使用removeObject清除数组控制器:但这会导致“无法将此方法与ModelObjectContect一起使用。”

为什么我需要MOC从阵列控制器中删除项目?它仅用于显示目的,因此我不需要它持续存在。如果我将数组控制器MOC设置为我的应用程序委托的MOC,它会实际删除用户,这显然是我不想要的。我只是想从表格的表格视图中删除它们。

我认为答案可能是创建另一个MOC用作暂存器而不是将其绑定到持久存储,但是这在使用removeObject时给了我一个不同的错误,这就是“可以”的行t删除另一个MOC中存在的对象。“

为什么我允许将对象添加到数组控制器但不删除它们?如果您实际上并不想要物理删除的项目,您应该访问基础“内容”,例如[arraycontroller内容]?我已经玩过这个,但得到了奇怪的显示结果,因为它似乎正在播放阵列控制器背后的内容。如果我这样做,有没有办法告诉阵列控制器“顺便说一句,我一直在修补你的内容,你可能需要让自己在一起”?

在我看来,你不应该使用没有Core Data的阵列控制器,但是文档中有很多注释表明它可以使用和不使用核心数据。

3 个答案:

答案 0 :(得分:2)

是的,您可以使用没有Core Data Managed Object Context的阵列控制器。但是当你在其中存储NSManagedObject个实例时,我认为当你删除它们时它会尝试将它们标记为删除。

如果您使用托管对象并且不希望在删除时删除阵列控制器的内容,则必须使用Cocoa Bindings将阵列控制器的内容绑定到另一个对象的属性。

但是有一个更简单的解决方案。我建议你将数组控制器的托管对象上下文设置为主MOC,并使用谓词来过滤其内容。

[arrayController setPredicate:[NSPredicate predicateWithFormat:@"NONE groups == %@", group]];

因此,无需在阵列控制器中添加或删除用户,因为该组中已有的所有用户都将被隐藏。

答案 1 :(得分:1)

您可以在有和没有核心数据的情况下使用它们,但是阵列控制器要么使用核心数据(实体支持),要么不使用核心数据。我不认为你可以使用托管对象,有上下文。

我不清楚为什么要创建对象而不仅仅是使用获取请求?

您没有说明如何添加“缺失”用户但是如果这只是一个基本列表,您可以考虑创建一个代理对象数组(这样您就不会触及MOC)了表完成了。您可以使用非核心数据阵列控制器,或者只是(喘息!)根本不使用绑定并以旧式方式执行。

答案 2 :(得分:0)

为什么不使用[arrayController setContent:nil]