Macos 在单个NSOutlineView中可视化不同的实体

Macos 在单个NSOutlineView中可视化不同的实体,macos,cocoa,core-data,cocoa-bindings,nsoutlineview,Macos,Cocoa,Core Data,Cocoa Bindings,Nsoutlineview,假设我正在使用核心数据为动物创建参考应用程序。每种动物都生活在一个栖息地,并有一个分类。分类可以使用简单的一对多父/子关系在核心数据中建模子分类 我想用一个NSOutlineView来可视化所有三个实体——栖息地、分类和动物。例如,它可能如下所示: v Animals Cat Parrot Seagull Toucan Sam v Habitats Cereal Box Coast Jungle Living Room v Classificati

假设我正在使用核心数据为动物创建参考应用程序。每种动物都生活在一个栖息地,并有一个分类。分类可以使用简单的一对多父/子关系在核心数据中建模子分类

我想用一个NSOutlineView来可视化所有三个实体——栖息地、分类和动物。例如,它可能如下所示:

v Animals Cat Parrot Seagull Toucan Sam v Habitats Cereal Box Coast Jungle Living Room v Classifications Mammal v Bird Tropical Bird Fictional Bird 我可以使用NSTreeController和Cocoa绑定非常轻松地可视化具有分层结构(如分类)的单个实体。而且已经这样做了。但是,这需要将表列绑定到单个同质类型

我想我可以创建一个自定义类,其中包含对我的NSTreeController对象的引用,然后将表列绑定到这个自定义类中的一个方法,该自定义类自己将各种ArrangedObject聚合到一个NSSet中。然而,Xcode似乎不想让我绑定到它,因为它显示了一个!并且拒绝让我在绑定检查器中设置控制器密钥

如何在单个NSOutlineView中可视化多个实体?

您有两个选项:

将超级实体用于栖息地、分类和动物,然后将NSTreeController中的键设置为该超级实体。 编写自定义控制器。 对于1,树控制器正在查找父子关系。对于大纲树中显示的所有对象,该关系的键名称必须相同。如果您提供了一个具有eh键名称的超级实体,那么它的所有子实体都将响应树控制器

然而,这里真正的问题是概念性的。您将实体与托管对象混淆,并试图创建一个大纲,其中一个层次表示实体,另一个层次表示托管对象

v EntityName="Animals"
   anAnimalObject.name="cat"
   anAnimalObject.name="Parrot"
   anAnimalObject.name="Seagull"
v EntityName="Habitats"
   aHabitatObject.name="Cereal Box"
   aHabitatObject.name="Coast"
v EntityName="Classifications"
   aClassificationObject.name="Mammal"
   v aClassificationObject.name="Bird"
      aClassificationObject.name.subclassifications.anotherClassificationObject.name="Tropical Bird"
如果使用绑定,则数据模型在某些方面与UI类似。您的数据模型看起来不像这样。数据模型不会对实体本身进行递归建模,因此不能单独使用数据模型来显示实体或按实体分组和排列的对象


您将需要编写一个自定义控制器,该控制器将有代码来检查每个对象的实体以及对象在大纲层次结构中的正确位置。您将需要三个单独的抓取,每个实体一个

正如我在问题中提到的,我试图编写一个自定义控制器,但我不知道如何将它绑定到Xcode中的表列。这基本上是我的问题:我该怎么做?