NSArrayControllers和Core Data对象的异构数组

时间:2011-06-20 14:39:23

标签: cocoa macos core-data parent-child nsarraycontroller

我正在尝试创建一个Mac OS Core Data应用程序,该应用程序具有一个父对象数组(称为Levels),每个父对象都包含一对子对象(称为Blocks),它们通过一对多关系。我有一个成功控制级别数组的表视图,以及一个自定义视图对象,它根据我的Block模型类的x和y属性中保存的位置以图形方式绘制块。我可以将块添加到当前选定的级别,删除它们,在自定义视图中选择并移动它们,并将文本字段绑定到Block类的各种其他属性,我可以使用它们来编辑这些值。所有这些信息都成功保存并从核心数据存储库中恢复,并且没有问题输出到调试器。精彩。我已经使用NSArrayController作为Levels,另一个用于绑定到Levels数组控制器当前选择的Blocks,我读过的是一种非常标准的方式。

现在,我的Block类实际上是一个抽象类,我实际实例化的是Block的各种子类(例如RedBlock,GreenBlock,BlueBlock类)。每个子类都有一组单独的属性,这些属性仅适用于该类型的块(因此RedBlock具有“text”属性,其他所有属性都没有,BlueBlock具有整数“value”属性等)。我想创建一个检查器,它将根据我在自定义视图中当前选择的块的类型进行更改。为了尝试这个,在我开始为每种类型的Bock创建子视图之前,我创建了一个文本字段,我想绑定到当前选择的RedBlock的“text”属性,当选择其他类型的块时,最好不显示任何内容。这就是我被困住的地方。我在实体模式中添加了另一个NSArrayController,并指定了RedBlock的类型,因此我可以绑定到“text”属性,并尝试根据类类型添加过滤谓词。我也尝试了各种其他配置和绑定,但是我要么得到异常,要么在我绑定到该控制器的文本字段中损坏值,或者其他奇怪的错误和一般破坏。

我已经搜索了一个检查员的例子,这个检查员能够应对异质的一系列物体(因为这基本上就是我想做的事情),但到目前为止还没有运气。

所以,我的问题是 - 我是否以正确的方式解决这个问题?我应该尝试创建一个NSArrayController,以某种方式过滤我的Blocks数组控制器中的选定项目?如果是这样,那应该是直截了当还是有一些我错过的技巧?如果没有,最好的方法是什么?

1 个答案:

答案 0 :(得分:0)

如果您将检查器限制为显示绑定到适用于整个选择的属性的视图,则此方法应该有效。您不需要第二个阵列控制器。

要测试这个简单示例,请尝试仅使用块创建数据集,查看绑定控件是否加载而不引发异常,并且正确更新对象。

一旦有效,为每种类型创建单独的视图,并在选择更改时显示和隐藏它们。同样,如果您有异类选择,请将它们全部隐藏起来。