【问题标题】:Using NSArrayController without Core Data在没有核心数据的情况下使用 NSArrayController
【发布时间】:2012-03-19 18:01:52
【问题描述】:

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

以下是应用挂起的方式;

窗口 1 - 在表格视图中显示用户列表并允许添加和删除用户。内容通过核心数据绑定持久化。

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

添加用户表 - 此表显示尚未成为所选组成员的用户的表格视图。按下工作表上的关闭按钮会将选定的用户添加到选定的组中。

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

为什么我需要 MOC 才能从阵列控制器中移除项目?它仅用于显示目的,所以我不需要它持续存在。如果我将阵列控制器 MOC 设置为我的应用程序委托的,它会物理删除用户,这显然是我不想要的。我只想将它们从工作表的表格视图中删除。

我认为答案可能是创建另一个 MOC 用作便签本,而不是将其绑定到持久存储,但这只是在使用 removeObject: 时给了我一个不同的错误:,类似于“可以” t 移除存在于另一个 MOC 中的对象。”

为什么我可以将对象添加到数组控制器但不能删除它们?在您实际上不希望物理删除项目的情况下,您应该访问底层的“内容”,例如[阵列控制器内容]?我玩过这个但得到奇怪的显示结果,因为它似乎在玩它背后的阵列控制器的内容。如果我这样做,有没有办法告诉数组控制器“顺便说一句,我一直在修补你的内容,你可能需要振作起来”?

在我看来,您不应该在没有 Core Data 的情况下使用数组控制器,但是文档中有许多 cmets 表明它可以在有无核心数据的情况下使用。

【问题讨论】:

    标签: objective-c core-data nsmanagedobjectcontext nsarraycontroller


    【解决方案1】:

    是的,您可以在没有核心数据托管对象上下文的情况下使用数组控制器。但是当您在其中存储 NSManagedObject 实例时,我认为它会在您删除它们时尝试将它们标记为删除。

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

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

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

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

    【讨论】:

    • 我认为这就是我的答案,但是我无法正确判断谓词。您已经使用了 CONTAINS,但这是用于字符串的,不是吗?我尝试过使用 IN 但无法获得快乐,因为我是一个谓词菜鸟。我想我需要类似 [sheetUsersAC setFetchPredicate:[NSPredicate predicateWithFormat:@"NOT %@ IN groups", [groupsAC selection]]] 的东西,但这不起作用。这么近……
    • 是的,你是对的:CONTAINS 仅适用于字符串。我的错。我认为"NONE groups == %@" 应该可以工作。
    • 终于破解了!我没有意识到选择返回的是代理对象而不是源对象。要从选择中获取源对象,我必须使用 valueForKey:@"self"。一旦我理解了这一点,我发现我可以使用“NONE groups == %@”或“NOT %@ IN groups”:[sheetUsersAC setFetchPredicate:[NSPredicate predicateWithFormat:@"NOT %@ IN groups", [[groupsAC selection] valueForKey:@"self"]]]
    【解决方案2】:

    您可以在有或没有核心数据的情况下使用它们,但阵列控制器要么使用核心数据(实体支持),要么不使用。我认为您不能将一个与托管对象一起使用,并且 not 有上下文。

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

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2023-03-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-12-14
        相关资源
        最近更新 更多