如何使用 NSArray 绑定在两个 NSTableView 中显示两个 1-m 相关的 CoreData 实体

How to display two 1-m related CoreData entities in two NSTableViews using NSArray bindings

我在 CoreData 中定义了一个实体 'person' 和一个 1 米的相关实体 'visit'。现在我想在 MacOS

上使用具有 COCOA 绑定的 NSArray 控制器在相关 table 中显示和修改它们的值

我的项目是针对 MacOS 的,我正在使用 Xcode 和 Swift。 我已经使用 Xcode 生成器定义了数据结构和 Viewcontroller 对象。 'person' 的 table 已经在工作,我可以添加或删除人员。但是我找不到将 'visit' table 绑定到所选人员的方法。我尝试了几个选项,比如按照 Master-detail using bindings with TWO NSTableViews 中的建议连接 'visit' 数组控制器的内容,但都以编译时错误告终。

由于我正在使用可视化 Xcode 构建器,目前代码不多。这是我到目前为止所做的:

我用 Xcode 数据模型构建器定义了两个实体 类,然后用故事板界面构建器定义了两个 table 和数组控制器。然后我将 table 视图内容绑定到各自的数组控制器,并将列绑定到它们自己的具有各自实体属性的 table 视图。我还添加了 + 和 - 按钮来添加一些行。到目前为止一切正常。但是详细信息 ('visit') 与任何 'person' 都没有关系。因此,我删除了 'visit' table 中的所有条目,并尝试将其数组控制器的内容绑定到所选人员。那就是我卡住的地方。 也许我错过了一些 CoreData 实体的初始化,但我不知道如何进行

我正在查看我的 macOS 项目,它在 Master-Detail 中有两个 NSTableView。

  • .xib 有两个数组控制器,一个用于主实体和一个从属实体。我们称它们为 MasterAC 和 DetailAC。 Master 和 Detail table 列绑定到这些阵列控制器。
  • 在 DetailAC 的绑定中,内容数组 绑定绑定到:MasterAC.selection.details,其中 details 是 [=51] 的名称=] 关系.
  • 在 MasterAC 和 DetailAC 的绑定中,Managed Object Context 绑定绑定到相同的 managed object context。
  • 在数组控制器中,只有这两个绑定(Content ArrayManaged Object Context) 绑定。

如果这还不能解决问题,我可以再四处看看。 Cocoa 在 macOS 中与 Core Data 的绑定一旦开始工作就会很漂亮 :))

附录。如果你有 an-ordered 设置

如果 master-to-detail to-many 关系是一个无序集,并且您使用的是在 Detail 实体上定义 index 属性的老派方法,您可以定义一个 detailsOrdered 属性在你的主人 class 像这样:

func detailsOrdered() -> [Any]? {
    return details().arraySorted(byKeyPath: "index")
}

然后绑定到 MasterAC.selection.detailsOrdered 而不是 MasterAC.selection.details

以上实现需要对 Set 进行以下扩展:

extension Set<AnyHashable> {
    func arraySorted(byKeyPath keyPath: String?) -> [Any]? {
        let unorderedArray = Array(self)
        let sortDescriptor = NSSortDescriptor(key: keyPath, ascending: true)
        let orderedArray = (unorderedArray as NSArray).sortedArray(using: [sortDescriptor])
        return orderedArray
    }
}