NSTreeController具有两个不同的核心数据NSManagedObject实体

时间:2011-06-26 16:47:46

标签: objective-c cocoa core-data nsmanagedobject nstreecontroller

我正在将我的iOS应用程序移植到Mac,并且想要设置NSTreeController来管理实体的层次结构。此层次结构中有两种不同的NSManagedObject类型,Group和Item,它们具有一对多关系(一个Group到多个Items)。但是我在设置NSTreeController时遇到了麻烦;我收到一条错误消息:

[<NSManagedObject 0x10029c410> valueForUndefinedKey:]: the entity Item is not key value coding-compliant for the key "items".

似乎NSTreeController旨在使用一个类型的NSManagedObject进行设置,其子级引用本身,并且让子级成为不同类型的对象不起作用。它是否正确?如果是这样,我需要做些什么来纠正这个问题,同时保持新数据模型能够使用轻量级迁移从旧数据模型中正确迁移?如果我确实能够使用两种不同的NSManagedObjects来完成NSTreeObject,我应该如何设置它?

1 个答案:

答案 0 :(得分:2)

NSTreeController中使用的所有实体都必须响应setChildrenKeyPath:设置的指定子消息。在这种情况下,items。换句话说,即使对象永远不会有任何子节点,树结构中的所有对象都必须响应items消息

E.g。假设您要为文件系统建模并使用NSTreeController显示它。您必须拥有如下所示的数据模型:

FileSystemObject{
  name:
  parent<<-->FileSystemObject.children
  children<-->>FileSystemObject.parent
}

Folder:FileSystemObject{
}

File::FileSystemObject{
}

然后,您将覆盖提供FileSystemObject的自定义方法,该方法将返回子项数。您可以使用setCountKeyPath:向NSTreeController提供方法名称。覆盖Folder中的方法以返回实际的子项数,并在File中覆盖以返回零。

这就是NSTreeController没有被充分考虑的原因。与其他控制器不同,它通过强制您更改数据模型以满足UI的需求来打破封装,这是非常糟糕的做法。

有人编写了一个替换树控制器,它只是自动假设任何不响应子键路径的对象都是一个叶子,并提供自动子计数为零。不幸的是,我现在找不到它,也不记得它叫什么。