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

Posted

技术标签:

【中文标题】在单个 NSOutlineView 中可视化不同的实体【英文标题】:Visualizing different Entities within a single NSOutlineView 【发布时间】:2011-09-16 00:56:10 【问题描述】:

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

我想使用单个NSOutlineView 可视化所有三个实体——HabitatsClassificationsAnimals。例如,它可能看起来像这样:

v 动物 猫 鹦鹉 海鸥 巨嘴鸟山姆 v 栖息地 麦片盒 海岸 丛林 客厅 v 分类 哺乳动物 v 鸟 热带鸟 虚构的鸟

我可以使用 NSTreeController 和 Cocoa Bindings 很容易地可视化像 Classifications 这样的单个实体(具有层次结构)。 (并且已经这样做了。)但是,这需要将表列绑定到单个同质“类型”。

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

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

【问题讨论】:

【参考方案1】:

你有两个选择:

    HabitatsClassificationsAnimals 使用超实体,然后将 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 中的表格列。这基本上是我的问题:我该怎么做?

以上是关于在单个 NSOutlineView 中可视化不同的实体的主要内容,如果未能解决你的问题,请参考以下文章

从 NSOutlineView 中拖放

NSOutlineView - 在启动时滚动到顶部

MacOS-NSOutlineView使用

NSTreeController/NSOutlineView 失去选择

NSOutlineView -- reloadItem:reloadChildren: 让我的应用程序崩溃

如何获取在 NSOutlineView 的上下文菜单中右键单击的元素?