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

Cocoa 在独立NIB文件中的多个视图之间共享NSArrayController,cocoa,Cocoa,首先,介绍一些背景知识:我正在尝试用Cocoa(用于OSX)实现一个主细节接口。也就是说,我有一个窗口,其中有两个NSTableViews,显示两种不同类型的对象。对于这个问题,假设它们是仓库和包(选择一个与我的实际问题类似的示例)。在第一个表视图中选择一行(在仓库上)将在第二个表视图中显示属于该仓库的包的列表。对于模型部分,我目前有一个称为仓库对象仓库的NSMutableArray,每个仓库对象都有一个包对象的NSArray。需要注意的一点是,在加载NIB文件后,warehouses变量会被修

首先,介绍一些背景知识:我正在尝试用Cocoa(用于OSX)实现一个主细节接口。也就是说,我有一个窗口,其中有两个
NSTableView
s,显示两种不同类型的对象。对于这个问题,假设它们是仓库和包(选择一个与我的实际问题类似的示例)。在第一个表视图中选择一行(在仓库上)将在第二个表视图中显示属于该仓库的包的列表。对于模型部分,我目前有一个称为仓库对象仓库的
NSMutableArray
,每个仓库对象都有一个包对象的
NSArray
。需要注意的一点是,在加载NIB文件后,warehouses变量会被修改,因此必须通知
NSArrayController

现在,我尝试组织它,以便“主视图”位于其自己的视图对象中,“细节”位于其自己的视图对象中。这意味着有三个NIB:仓库视图NIB、仓库详细视图NIB和主窗口NIB

  • WarehousesView NIB包含WarehousesView控制器(从
    NSViewController
    子类)的实例和视图本身
  • WarehouseDetailView NIB包含WarehouseDetailViewController的实例和视图本身
  • MainWindow NIB包含主窗口、MainWindowController实例以及WarehousesView和WarehouseDetailView实例。窗口本身包含一个
    NSSplitView
    ,拆分视图的视图连接到NIB文件中相应的视图实例
这就引出了我问题的前半部分:

1) 这是分割Cocoa应用程序的应用程序视图的好方法吗?对我来说,这是有道理的,因为在以后的某个时候,除了包裹库存列表之外,仓库的更多详细信息可能会添加到WarehouseDetailView中。

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

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

2) 如果我按照上述方式将其拆分,以便主-详细界面仍能正常工作,那么应将对应于仓库和包裹的
NSArrayController
s放置在何处?目前我正在使用Cocoa绑定,因此仓库
NSArrayController
的内容数组需要绑定到我的仓库数组,而包
NSArrayController
的内容数组需要绑定到仓库的选择
NSArrayController

我试过一些方法,但都不能完全奏效。具体来说,我尝试将仓库的
NSArrayController
放入WarehousesView NIB,将包裹的
NSArrayController
放入WarehouseDetailView NIB。这种方法的问题是,我无法找到将包
NSArrayController
绑定到仓库
NSArrayController
选择的方法。我尝试过的另一件事是(1)将两个
NSArrayController
s放入主窗口NIB,(2)将这些
NSArrayController
s连接到主窗口控制器中的IBOutlets,然后(3)通过其构造函数将这些变量传递给各自的视图控制器,(4)通过KVC在视图控制器中将它们作为属性公开,(5)通过文件所有者将视图中必要的表列绑定到阵列控制器。结果是什么也没有出现,但也没有错误。如果其中一种方法是首选的方法,我可以提供更多的细节,以帮助查看我是否做得不正确

提前谢谢


编辑:我确实看过,如果我理解正确,他们似乎对每个NIB文件使用了单独的
NSArrayController
s实例,从设计的角度来看,这似乎没有什么意义,但也许我错了?

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

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

您必须记住,nib中的每个对象都是真实的实例。nib为您分配和初始化它们;如果将
MyClass
对象放在一个nib中,将
MyClass
对象放在另一个nib中,则这是两个不同的对象。对于NIB,这有时是一件棘手的事情:自动为您创建实例非常方便,但这也意味着当您想要跨NIB执行操作时,需要对引用进行一些修改

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

我不知道你的模型存储在哪里,也不知道你是如何加载笔尖的。不过,无论它加载哪个对象,都可能是您之间的链接