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

Objective c 具有两个不同核心数据NSManagedObject实体的NSTreeController,objective-c,cocoa,core-data,nsmanagedobject,nstreecontroller,Objective C,Cocoa,Core Data,Nsmanagedobject,Nstreecontroller,我正在将iOS应用程序移植到Mac上,并希望设置一个NSTreeController来管理实体的层次结构。此层次结构中有两种不同的NSManagedObject类型:组和项,它们具有一对多关系(一组对多项)。但是,我在设置NStree控制器时遇到问题;我收到一条错误消息: [<NSManagedObject 0x10029c410> valueForUndefinedKey:]: the entity Item is not key value coding-compliant fo

我正在将iOS应用程序移植到Mac上,并希望设置一个NSTreeController来管理实体的层次结构。此层次结构中有两种不同的NSManagedObject类型:组和项,它们具有一对多关系(一组对多项)。但是,我在设置NStree控制器时遇到问题;我收到一条错误消息:

[<NSManagedObject 0x10029c410> valueForUndefinedKey:]: the entity Item is not key value coding-compliant for the key "items".
[valueForUndefinedKey:]:实体项与键“项”的键值编码不兼容。

NSTreeController似乎打算使用一种类型的NSManagedObject进行设置,其子对象指的是它自己,而将子对象设置为不同类型的对象是行不通的。这是正确的吗?如果是这样,我需要做什么来纠正这一点,同时保持新数据模型能够使用轻量级迁移从旧数据模型正确迁移?如果我确实能够使用两种不同类型的NSManagedObject完成NSTreeObject,我应该如何设置它?

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

例如,假设您要对文件系统建模,并使用NSTreeController显示它。您必须有一个如下所示的数据模型:

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

Folder:FileSystemObject{
}

File::FileSystemObject{
}
FileSystemObject{
姓名:
parentFileSystemObject.parent
}
文件夹:FileSystemObject{
}
文件::FileSystemObject{
}
然后,您将重写为
FileSystemObject
提供一个自定义方法,该方法将返回子对象的计数。您可以使用
setCountKeyPath:
向NSTreeController提供方法名称。覆盖
文件夹
中的方法以返回实际的子项计数,覆盖
文件
中的方法以返回零

这就是为什么NSTreeController没有得到很好的考虑。与其他控制器不同,它通过强制您更改数据模型以满足UI的需要来打破封装,这是一种非常糟糕的做法

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