Cocoa 多个NSVIEW控制器的NS(阵列|树)控制器体系结构

Cocoa 多个NSVIEW控制器的NS(阵列|树)控制器体系结构,cocoa,architecture,Cocoa,Architecture,我有一个非基于文档的核心数据应用程序。有一个NSTreeController,它管理一组对象,这些对象作为源列表显示在单个NSOutlineView中。它们是常见的类型:标题、文件夹、智能文件夹等 每个容器对象都有一个内容的集合对象。我有三个独立的视图控制器,它们以不同的方式显示这些对象(一个NSTableView和两个自定义图形视图,如果您真的想知道的话),但它们实际上只是相同数据的三种不同表示。它们应始终显示相同的对象、共享相同的选择等 我还使用NSViewControllers的层次结构来

我有一个非基于文档的核心数据应用程序。有一个
NSTreeController
,它管理一组对象,这些对象作为源列表显示在单个
NSOutlineView
中。它们是常见的类型:标题、文件夹、智能文件夹等

每个容器对象都有一个
内容的集合
对象。我有三个独立的视图控制器,它们以不同的方式显示这些对象(一个
NSTableView
和两个自定义图形视图,如果您真的想知道的话),但它们实际上只是相同数据的三种不同表示。它们应始终显示相同的对象、共享相同的选择等

我还使用
NSViewController
s的层次结构来管理我的视图。(如果我当时知道Cathy Shive的优秀作品,我会使用它,但我的视图控制器与她的非常相似,并且深受她的启发)

现在,我在源代码列表视图的视图控制器中有一个
NSTreeController
。我还在每个子视图控制器中都有一个
NSArrayController
,它通过一些过于复杂的关键路径绑定到
NSTreeController

因此,我认为需要改变的是:

  • NSTreeController
    需要移出outline视图的控制器
  • 应该有一个
    NSArrayController
    ,每个内容视图都可以绑定到它,而不是三个单独的视图。虽然我不太确定这一点

我现在很难弄清楚这些东西应该住在哪里。我很难决定哪些对象(如果有的话)真正“拥有”各种控制器。父视图控制器拥有它吗?窗口控制器有问题吗?由于这是应用程序级数据,我是否会将这些数据归应用程序代理所有?(我可以想象一个用户可能想要打开多个窗口的情况,尽管目前不支持这种情况)StackOverflow hive mind会怎么想?

NSArrayController和NSTreeController更多地被视为视图对象,而不是真正的控制器,因此听起来您的思路是正确的。我将以与您大致相同的方式开始,根据需要为每个NSViewController提供自己的NSArrayController或NSTreeController,并在运行时通过负责将所有部分放在一起的窗口控制器配置它们之间的绑定

如果您认为这样做可以简化事情,那么将NSArrayController和NSTreeController对象移动到窗口控制器听起来并没有什么问题。您仍然可以在IB中设置与视图控制器的representedObject的绑定,然后在适当的时间在窗口控制器中的代码中创建数组/树控制器。小心点,别把事情搞得太复杂了。我发现,如果在同一窗口中有许多视图控制器使用representedObject处理不同的内容,那么创建单独的、类型化的属性就更容易了,这样您就可以了解哪些部分放在哪里了

我真的不明白让数组/树控制器成为应用程序委托的一部分有什么好处,但我不知道你在那里做什么。也许你会从制作自己的“数据控制器”对象中获益


像这样的问题可能很难决定,因为有时没有“正确”的答案,但只要你记住简单易懂,你就会没事的。不要害怕选择一个计划并继续前进,你可以在以后重构。。。我知道有时候我会花上几天的时间研究这样的架构问题,那时我本可以做一些更实际的事情

感谢您周到的回复!我一直认为对象控制器也更面向视图。这就是我在这里犹豫不决的部分原因:-)我没有想过使用representedObject作为控制器;我有点听天由命地以编程方式进行绑定。这个问题的动机是我已经到了必须重构的地步。在奇怪的地方管理控制器的复杂性太痛苦了。我还排除了应用程序代理作为合适的位置。窗户感觉是最符合逻辑的地方。