【问题标题】:How to display two 1-m related CoreData entities in two NSTableViews using NSArray bindings如何使用 NSArray 绑定在两个 NSTableView 中显示两个 1 米相关的 CoreData 实体
【发布时间】:2019-10-15 19:38:39
【问题描述】:

我在 CoreData 中定义了一个实体“人”和一个 1 米相关的实体“访问”。现在我想在 MacOS 上使用带有 COCOA 绑定的 NSArray 控制器在相关表中显示和修改它们的值

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

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

我已经用 Xcode 数据模型构建器定义了两个实体类,然后用故事板接口构建器定义了两个表和数组控制器。然后,我将表视图内容绑定到各自的数组控制器,并将列绑定到具有各自实体属性的自己的表视图。我还添加了 + 和 - 按钮来添加一些行。到目前为止一切正常。但细节(“访问”)与任何“人”无关。因此,我删除了“访问”表中的所有条目,并尝试将其数组控制器的内容绑定到所选人员。那就是我卡住的地方。 也许我错过了 CoreData 实体的一些初始化,但我不知道如何继续

【问题讨论】:

  • 请发布您的代码和错误。表视图是否在同一个视图控制器中?
  • 因为我正在与故事构建器一起工作,所以在我遇到问题的早期开始时没有太多代码。我会尝试解释更多细节

标签: swift xcode macos core-data cocoa-bindings


【解决方案1】:

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

  • .xib 有两个阵列控制器,一个用于主实体和详细实体。我们称它们为 MasterAC 和 DetailAC。 Master 和 Detail 表列绑定到这些数组控制器。
  • 在 DetailAC 的绑定中,Content Array 绑定绑定到:MasterAC.selection.details,其中details 是主从关系的名称。
  • 在 MasterAC 和 DetailAC 的绑定中,两者中的 Managed Object Context 绑定绑定到相同的托管对象上下文。
  • 在数组控制器中,只有这两个绑定(Content ArrayManaged Object Context)被绑定。

如果这不能解决问题,我可以再多找一些。在 macOS 中使用 Core Data 的 Cocoa 绑定是很漂亮的,一旦你让它们工作了 :))

附录。如果你有一个有序集合

如果 master-to-detail to-many 关系是一个无序集合,并且您使用的是在 Detail 实体上定义 index 属性的老式方法,则可以在 Master 中定义 detailsOrdered 属性像这样的类:

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
    }
}

【讨论】:

  • 您的details 是有序关系吗?
  • 好问题。不,因为这个项目是多年前开始的,在 Core Data 支持有序关系之前。所以它实际上是老派:我的 NSManagedObject 的detail 子类有一个index 属性,而'master` 有一个detailsOrdered 只读属性,它将details 作为数组返回,按index 排序。我从我的回答中省略了这个复杂性。在我的旧项目中,绑定实际上是MasterAC.selection.detailsOrdered。如果details 是有序集,我认为它应该“正常工作”。但如果没有,老派仍然有效。
  • 老派是否使用内容集绑定?
  • 没有。它正在使用 Content Array.
  • “老派”是什么意思?如何绑定无序关系?
猜你喜欢
  • 2013-11-20
  • 2013-02-11
  • 2011-12-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-02-08
  • 1970-01-01
相关资源
最近更新 更多