我正在将我的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,我应该如何设置它?
答案 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的需求来打破封装,这是非常糟糕的做法。
有人编写了一个替换树控制器,它只是自动假设任何不响应子键路径的对象都是一个叶子,并提供自动子计数为零。不幸的是,我现在找不到它,也不记得它叫什么。