NSOutlineView - 结合多个来源

时间:2010-11-11 18:08:05

标签: objective-c cocoa macos nsoutlineview nstreecontroller

在我的应用中,我有NSOutlineViewNSTreeController获取数据 - 而后者又从核心数据模型中获取数据。

我现在要做的是在大纲视图中添加组标题和一些额外的行 - 显然应该存在于模型外部并且是视图的一部分。但是,尽管我对此不知所措,我想不出任何方法可以让大纲视图显示这些东西而不修改底层模型,这显然是一个很大的禁忌。

非常感谢您的帮助。我觉得我错过了一些明显的东西......

1 个答案:

答案 0 :(得分:4)

您在这里要做的是编写自定义NSTreeController子类。这就是为什么这是您想要做的改变的理想场所:

  • 正如你所说,它不在模型中。
  • 与视图无关 - 完全透明。
  • 基本上你想要的是从保存的数据中创建显示的数据< - 这是控制器的任务。

幸运的是,Cocoa中的Controller类非常强大,而且非常简单。对你来说,它应该足以覆盖-arrangedObjects方法。重用默认实现,因为它执行许多有用的操作,如应用谓词或排序。这是这样的:

- (id)arrangedObjects {
  id root = [super arrangedObjects];

  // "root" is something like a NSTreeNode but not quite yet
  NSTreeNode *newRoot = [NSTreeNode treeNodeWithRepresentedObject: nil];
  [[newRoot mutableChildNodes] setArray: [root childNodes]];

  // Do your customizations here

  return newRoot;
}

返回的对象属于类NSTreeNode - 请参阅有关如何进行修改的文档。