2

我正在将我的 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,我应该如何设置它?

4

1 回答 1

2

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

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

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

Folder:FileSystemObject{
}

File::FileSystemObject{
}

然后,您将覆盖提供一个自定义方法,FileSystemObject该方法将返回子项的数量。您可以使用setCountKeyPath:. 重写 in 方法Folder以返回子项的实际计数,并重写 inFile以返回零。

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

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

于 2011-06-27T15:32:04.743 回答