如何将 NSOutlineView 与多个核心数据实体作为组一起使用

Posted

技术标签:

【中文标题】如何将 NSOutlineView 与多个核心数据实体作为组一起使用【英文标题】:How to use NSOutlineView with multiple core data entities as groups 【发布时间】:2018-08-12 19:57:40 【问题描述】:

我一直在研究如何使用多个实体从核心数据中填充源列表。如果我有一个实体,我可以按照文档并使用 NSTreeController 来填充我的数据并将其绑定到 NSOutlineView。

在我的具体情况下,我有大约 3 个硬编码组,其中每个组都与一个单独的核心数据实体相关。我试图将它们组合起来,但它们都与不同的实体有关系,所以我无法将它们全部组合到一个核心数据实体中。理想情况下,我想将我的 3 个核心数据实体绑定到我的源列表,它们看起来如下所示(其中钢笔、纸张和办公桌都是独立的实体):

有谁知道无论如何我可以使用控制器来帮助管理和组合三个实体与我的源列表,或者最好的方法是手动填充 NSOutlineView?我可以使用某种 NSArrayControllers 数组来填充我的 NSOutlineView 吗?有没有办法可以覆盖 NSTreeController 以从三个来源获取数据?

【问题讨论】:

你试过NSOutlineViewDataSource吗?我想知道你似乎知道绑定的局限性。 @Purpose 我已经查看了“NSOutlineViewDataSource”,它是在有或没有核心数据的情况下填充 NSOutlineView 所必需的。但是,此时我想知道是否应该使用传统数据源而不是控制器手动完成所有操作。 我不会告诉你应该做什么。但是我告诉你,NSOutlineViewDataSource 没有 NSTreeController 和 NSArrayController 的限制。 您可以使用NSTreeController,但您必须提供内容。 @Willeke 你什么时候使用 NSTreeController 什么时候使用 NSOutlineViewDataSource 那么如果两者都适合呢?这只是 API 的一个区别,其中一个您必须检查它是哪种类型,然后采取相应的行动,而另一个您必须在每种类型中直接实现 child、isItemExtendable 和 numberOfChildren? 【参考方案1】:

作为一个实验,我创建了一个带有大纲视图和树控制器的项目。树控制器的内容是一个字典数组,数组控制器(实体模式)是出口:

treeController.content = [
    ["arrayController": penTreeArrayController, "name": "Pens"],
    ["arrayController": paperTreeArrayController, "name": "Papers"],
    ["arrayController": deskTreeArrayController, "name": "Desks"]
]

树形控制器是NSTreeController的子类:

override func childrenKeyPath(for node: NSTreeNode) -> String? 
    if node.representedObject is NSManagedObject 
        return nil
    
    return "arrayController.arrangedObjects"

它似乎工作。当我添加或移除一支笔时,大纲视图会自动更新。反过来不行,我不能用树形控制器来加笔。

【讨论】:

以上是关于如何将 NSOutlineView 与多个核心数据实体作为组一起使用的主要内容,如果未能解决你的问题,请参考以下文章

如何创建源列表以将核心数据显示到多个关系?

以编程方式将核心数据实体中的项目放入 NSOutlineView?

NSOutlineView 侧边栏帮助

使用 NSTreeController 过滤 NSOutlineView 的子项

自定义 NSMangedObject 访问器崩溃 NSOutlineView

如何有效地展平 NSOutlineView?