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

时间:2019-05-30 07:03:21

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

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

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

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

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

1 个答案:

答案 0 :(得分:0)

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

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

如果这不能解决问题,我可以进一步介绍一下。一旦使它们起作用,可可与macOS中的核心数据的绑定就会很漂亮:))

附录。如果您有订单集

如果主从到多对多关系是无序集合,并且您使用的是旧式方法来在Detail实体上定义index属性,则可以定义detailsOrdered像这样在您的Master类中设置属性:

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