在单独的NIB文件中的多个视图之间共享NSArrayController

Ste*_*her 7 cocoa

首先,一些背景:我正在尝试在Cocoa中实现一个master-detail接口(对于OS X).也就是说,我有一个带有两个NSTableViews 的窗口,它显示两种不同类型的对象.对于这个问题,让我们说它们是仓库和包(选择一个类似于我实际问题的例子.)在第一个表视图中选择一行(在仓库中)将显示属于该仓库的包列表第二个表视图.对于模型部分,我目前有一个NSMutableArray名为仓库对象的仓库,每个仓库对象都有一个NSArray包对象.需要注意的一点是,在加载NIB文件后修改仓库变量,因此NSArrayController必须通知.

现在,我试图组织它,以便"master"在它自己的视图对象中,"detail"在它自己的视图对象中.这意味着有三个NIB:WarehousesView NIB,WarehouseDetailView NIB和MainWindow NIB.

  • WarehousesView NIB包含WarehousesViewController(子类NSViewController)的实例和视图本身.
  • WarehouseDetailView NIB包含WarehouseDetailViewController的实例和视图本身.
  • MainWindow NIB包含主窗口,MainWindowController的实例以及WarehousesView和WarehouseDetailView的实例.窗口本身包含一个NSSplitView,并且拆分视图的视图连接到NIB文件中的相应视图实例.

这让我想到了我的问题的前半部分:

1)这是拆分Cocoa应用程序的应用程序视图的好方法吗?对我而言,这是有道理的,因为稍后可能会将更多关于仓库的详细信息添加到WarehouseDetailView中.

这是一个重要的问题,因为如果我跳过创建视图,将所有控件直接放在窗口中并将其他所有内容(包括NSArrayController与仓库和包相对应的实例)放入同一个NIB文件中,一切正常.我不需要问问题的后半部分我是否应该这样做.

问题的后半部分基本上是:

2)如果我按照上面的描述拆分它,那么我应该在哪里放置NSArrayController与仓库和包相对应的s,以便主 - 细节界面仍然有效?目前我正在使用Cocoa绑定,所以仓库的内容数组NSArrayController需要绑定到我的仓库数组,并且Packages的内容数组NSArrayController需要绑定到仓库的选择NSArrayController

我尝试了一些东西,但我完全无法完成任何工作.具体来说,我已经尝试将NSArrayControllerfor Warehouses放入WarehousesView NIB,将NSArrayControllerfor Packages放入WarehouseDetailView NIB.这种方法的问题在于我无法找到将Package绑定NSArrayController到Warehouse选择的方法NSArrayController.我尝试过的另一件事是(1)将两个NSArrayControllers放入MainWindow NIB,(2)将它们连接NSArrayController到MainWindowController中的IBOutlets,然后(3)通过它们的构造函数将这些变量传递给它们各自的视图控制器,(4)通过KVC在视图控制器中将它们公开为属性,以及(5)通过文件所有者将视图中的必要表列绑定到数组控制器.结果是没有出现,但也没有错误.如果其中一种方法是首选方法,我可以提供更多详细信息,以帮助查看我是否做错了.

提前致谢!

编辑:我确实看过这个相关的问题,NSArrayController如果我理解正确的话,他们似乎在为每个NIB文件使用单独的s 实例,从设计的角度看似乎没有意义,但也许我是错误?

Jos*_*ell 1

第 1 部分:您当然可以做到这一点。我想说这是一个偏好问题。就个人而言,如果要在窗口中同时显示视图,我会将它们保留在同一个笔尖中。* 不过,模块化也是一件好事。

\n\n

第 2 部分:实际上,您可以将阵列控制器放在您喜欢的任何位置。您唯一需要担心的是获取每个对象所需的对您希望其拥有的信息的引用。如果你想要我的 2\xc2\xa2,我会说将每个都放在笔尖中,并在视图中显示其内容。这将使你的详细视图设置更加困难,但它继续了你似乎正在进行的模块化为了。

\n\n

您必须记住,笔尖中的每个对象都是一个真实的实例。nib 会为您分配并初始化它们;如果您将一个MyClass对象放入一个笔尖,并将一个MyClass对象放入另一个笔尖,则它们是两个 不同的对象。对于 nibs 来说,有时这是一件棘手的事情:自动为您创建实例确实很方便,但是当您想要跨 nibs 执行操作时,这也意味着需要对引用进行一些摆弄。

\n\n

听起来好像您将WarehouseView和的实例WarehouseDetailView放入各个笔尖和 MainMenu.nib 中,并期望它们是相同的对象。不会是这样的。您必须将笔尖中的对象链接到它们已经知道的对象。您必须根据您的具体情况来解决这个问题。

\n\n

我不知道你的模型存储在哪里,也不知道你如何加载笔尖。不过,无论哪个对象执行加载操作,都可能是单个笔尖和应用程序其余部分之间的链接。这就是 nib 中文件所有者代理对象的用途——它为您提供了一个将 nib 中的对象与它们不知道的代码挂钩的位置。

\n\n
\n\n

*:如果您发现在 IB 中未将视图包含在拆分视图中,则可以更轻松地布局视图,您可以自行设置它们:将自定​​义视图对象放在 MainMenu.xib 窗口中,然后可以在它自己的 IB 窗口(尽管它不会位于应用程序的窗口中)。然后在某些内容中设置分割视图的子视图awakeFromNib

\n