Ale*_*lex 5 architecture cocoa
我有一个非基于文档的核心数据应用程序.有一个NSTreeController管理单个显示的对象集合NSOutlineView作为源列表.它们是常见的东西:标题,文件夹,智能文件夹等.
这些容器对象中的每一个都有一组contents对象.我有三个独立的视图控制器,以各种方式显示这些对象(一个NSTableView和两个自定义图形视图,如果你真的想知道)但这些只是相同数据的三个不同的演示.它们应始终显示相同的对象,共享相同的选择等.
我也使用NSViewControllers 的层次结构来管理我的观点.(如果我当时知道Cathy Shive的优秀KTUIKit,我会用它,但是我的视觉控制器非常相似 - 并且非常受她的启发)
就像现在一样,我NSTreeController在源视图列表视图的视图控制器中占有一席之地.我NSArrayController在每个子视图控制器中都有一个绑定到NSTreeController通道的一些过于复杂的键路径.
那么,在我看来,需要改变的是:
NSTreeController需要迁出大纲视图的控制器.NSArrayController每个内容视图都可以绑定到一个单独的视图而不是三个单独的视图.虽然我不太确定这一点.什么我遇到的困难是找出哪里,这些东西应该活.我很难决定哪些对象(如果有的话)真正"拥有"各种控制器.父视图控制器是否拥有它?窗户控制器?由于这是应用程序级数据,我是否应该让App Delegate拥有这些数据?(我可以想象一个使用可能想要打开多个窗口的情况,虽然目前不支持)StackOverflow蜂巢思维的想法是什么?
NSArrayController 和 NSTreeController 更多地被视为视图对象而不是真正的控制器,因此听起来您走在正确的轨道上。我会以与您相同的方式开始,根据需要为每个 NSViewController 提供自己的 NSArrayController 或 NSTreeController,并在运行时通过负责将所有部分组合在一起的窗口控制器配置它们之间的绑定。
如果您认为这会简化事情,那么将 NSArrayController 和 NSTreeController 对象移动到窗口控制器听起来并没有什么问题。您仍然可以在 IB 中设置与视图控制器的representedObject 的绑定,然后在适当的时间在窗口控制器中的代码中创建数组/树控制器。只是要小心,不要在这里变得太复杂。我发现,当您在同一窗口中有很多视图控制器时,使用representedObject 来处理不同的事情,创建单独的类型化属性会更容易,这样您就可以了解哪些部分放在哪里。
我真的不明白将数组/树控制器作为应用程序委托的一部分的好处,但我不太了解你在那里做什么。也许您会从制作自己的“数据控制器”对象中受益?
像这样的问题可能很难做出决定,因为有时没有“正确”的答案,但只要您牢记简单性和可理解性,就可以了。不要害怕选择一个计划并继续前进,您可以稍后进行重构...我知道有时我会花几天时间研究这样的架构问题,而我本来可以做一些更实用的事情!