将表示一对多关系的 NSSet 绑定到 NSArrayController 的选择

Posted

技术标签:

【中文标题】将表示一对多关系的 NSSet 绑定到 NSArrayController 的选择【英文标题】:Bind a NSSet representing a to-many relationship to the selection of a NSArrayController 【发布时间】:2011-12-19 07:59:29 【问题描述】:

这是场景。 CoreData 模型对象有 A 和 B 两个,它们之间的关系是A has-many B,由属性setOfBs 表示。我想显示两张表,一张列出所有 As(表 1),另一张列出所有 B(表 2)。当用户选择表 1 中的项目时,表 2 中的选择会发生变化,以反映表 1 中选择的 A 的 setOfBs 的值。表的内容没有变化,只是选择发生了变化。如果表 1 中的选择发生变化,它会更改 setOfBs 以反映这一点。

这可以使用绑定来完成吗?还是需要自定义逻辑?

【问题讨论】:

同理,典型的多对多关系编辑器是什么样的? 【参考方案1】:

我相信您必须编写额外的逻辑才能使这种方法发挥作用。原因如下: NSArrayControllers(以及绑定到它们的所有 UI 对象)的选择绑定是基于选择 indexes 但是当你有一个 A 类型的对象时,它会提供一组 B 对象。假设您有一个用于 As 的数组控制器和一个用于 Bs 的数组控制器,您需要一种方法从这些 objects 获取它们在 Bs 数组中的 indexes 以便设置为 B 选择数组控制器。这不是很难编写的代码,但我不相信您可以仅使用绑定来完成此操作。

也就是说,正如您在评论中推测的那样,这似乎不是编辑这种关系的好方法。在常见情况下,TableView 选择是 UI 状态,而不是 model 状态。如果你像描述的那样构建一个 UI,UI 状态和模型状态就变成了同一件事。我并不是说这是不可能的,或者本质上是不好的,但这并不是做这类事情的真正“标准”方式。一种常见的模式如下所示:

即使是这样的方法也需要额外的逻辑,因为似乎没有办法(开箱即用)在不编写代码的情况下绑定到“不在选定 A 的 setOfBs 中的所有 B”。同样,编写代码并不难,但我不清楚这可以单独使用绑定来完成。我可能是错的,但这是我对情况的解读。

【讨论】:

以上是关于将表示一对多关系的 NSSet 绑定到 NSArrayController 的选择的主要内容,如果未能解决你的问题,请参考以下文章

CoreData 一对多关系。 NSSet 归属问题

在空 NSSet 上迁移关系到一对多结果

iOS核心数据一对多关系NSSET

使用 NSSortDescriptor 对一对多关系的 NSSet 类型的数据进行排序

如何获取所有对象A的一对多关系B的所有属性的NSSet

将核心数据对象设置为 NSSet