如何使用 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 Array和Managed 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
}
}
我在 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 Array和Managed 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
}
}