使用跨越多个实体的核心数据绑定在 Cocoa 中实现父->子向下钻取

Posted

技术标签:

【中文标题】使用跨越多个实体的核心数据绑定在 Cocoa 中实现父->子向下钻取【英文标题】:Implementing parent->child drill down in Cocoa with Core Data bindings that span multiple entities 【发布时间】:2009-11-08 20:42:44 【问题描述】:

我正在尝试以 iTunes 流派浏览器的风格为我的核心数据模型创建一个简单的界面。

我有一个包含三个实体的模型设置:Genre <-->> Artist <-->> Album

我想简单地将它们分别绑定到一个 NSTableView,但似乎从 NSArrayController 访问子关系不符合 KVC。所以,我很难将选定的流派对象传达给 ArtistController。

你是怎么做到的?在没有任何自定义子类的情况下,在 IB 中是否有可能?

为后代编辑:我做错了几件事。

子控制器需要通过自己的绑定了解 managedObjectContext。 子控制器必须处于Entity 模式,而是作为NSMutableDictionary 类运行。 最后,子控制器不准备其数据。它通过Content Set 绑定从父级检索它。使用控制器密钥selection,以及连接到孩子的模型密钥路径。

。 Brian 的回答和 this MacResearch tutorial 都有助于确定我的错误(以及我正确的部分)。

【问题讨论】:

【参考方案1】:

我可能会采取的方法是为每个表视图设置一个单独的 NSArrayController,然后让一个数组控制器的内容基于另一个数组控制器的选择。

例如,假设您有一个显示可用流派列表的表视图 A,因此它有一个数组控制器 A,其内容与您的托管对象上下文相关联。

然后,假设您有表视图 B,它显示了表 A 中选择的任何流派的可用艺术家。该表将具有自己的数组控制器 B,并且控制器 B 的内容数组被绑定,因此“控制器键” IB 中的字段设置为控制器 A 的“选择”键,其中“艺术家”是模型键(这假设您的流派实体与艺术家实体具有名为“艺术家”的一对多关系)。

然后,您可以将相同的原理应用于第三个表格视图 + 控制器,以显示所选艺术家的专辑。

这种设置的通用术语是“主从接口”,在 Apple 的文档this link中有概述

【讨论】:

是的,这正是我尝试过的。我收到运行时错误:[<MBGenre 0x20003c5a0> valueForUndefinedKey:]: the entity MBGenre is not key value coding-compliant for the key "artists". 我已经尝试了大约六七种不同的方式来访问子关系,但都没有奏效。感谢您的输入;这让我感觉不那么疯狂了。

以上是关于使用跨越多个实体的核心数据绑定在 Cocoa 中实现父->子向下钻取的主要内容,如果未能解决你的问题,请参考以下文章

在代码中使用核心数据 - Objective-C/Cocoa

带有核心数据的 Cocoa 绑定不更新所有列

Cocoa Binding 仅用于检索

Cocoa-Touch – 更新多对多关系的核心数据

Cocoa:如何避免核心数据重复关系?

使用 NSDocument 时如何将情节提要视图绑定到 Core Data 实体?