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

时间:2011-09-16 00:56:11

标签: macos cocoa core-data cocoa-bindings nsoutlineview

假设我正在为动物创建使用Core Data的参考应用程序。每个Animal都位于Habitat,并且有ClassificationClassification可能有子Classifications(使用简单的一对多父/子关系在Core Data中建模。)。

我想使用单个Habitats可视化所有三个实体 - ClassificationsAnimalsNSOutlineView。例如,它可能如下所示:

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 Bindings来轻松地可视化单个实体(具有层次结构),如Classifications。 (并且已经这样做了。)但是,这需要将表列绑定到单个同类“类型”。

我以为我可以创建一个包含对NSTreeController个对象的引用的自定义类,然后让表列绑定到此自定义类中的方法(执行各种{{1}的聚合自己进入arrangedObjects。但是,Xcode似乎不想让我绑定它(显示(!)并拒绝让我在Bindings检查器中设置Controller Key。)

如何在一个NSSet中可视化多个实体?

1 个答案:

答案 0 :(得分:0)

您有两种选择:

  1. HabitatsClassificationsAnimals使用一个超级用户,然后将NSTreeController键入超级用户。
  2. 编写自定义控制器。
  3. 对于(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。您的数据模型看起来不像这样。数据模型不会对实体本身进行递归建模,因此您无法单独使用数据模型来显示实体或显示按实体分组和排列的对象。

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