首先,一些背景知识:我正在尝试在 Cocoa(适用于 OS X)中实现主从接口。也就是说,我有一个窗口有两个NSTableView
显示两种不同类型的对象。对于这个问题,假设它们是仓库和包(选择一个与我的实际问题类似的例子。)在第一个表视图(在仓库上)中选择一行将显示属于该仓库的包列表第二个表视图。对于模型部分,我目前有一个NSMutableArray
称为仓库对象的仓库,每个仓库对象都有一个NSArray
包对象。需要注意的一件事是,warehouses 变量在 NIB 文件加载后被修改,因此NSArrayController
必须通知。
现在,我尝试组织它,使“主视图”位于其自己的视图对象中,“细节”位于其自己的视图对象中。这意味着存在三个 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
如果我按照上述方式将其拆分,以便主从接口仍然有效,则对应于仓库和包?目前我正在使用 Cocoa 绑定,所以不知何故仓库的内容数组NSArrayController
需要绑定到我的仓库数组和 Packages 的内容数组NSArrayController
需要与仓库的选择绑定NSArrayController
我尝试了一些事情,但我无法让任何事情完全发挥作用。具体来说,我尝试将NSArrayController
对于仓库进入 WarehousesView NIB 和NSArrayController
用于将包放入 WarehouseDetailView NIB 中。这种方法的问题是我无法找到绑定包的方法NSArrayController
到仓库的选择NSArrayController
。我尝试过的另一件事是(1)将两者NSArrayController
进入 MainWindow NIB,(2) 连接这些NSArrayController
s 到 MainWindowController 中的 IBOutlet,然后 (3) 通过它们的构造函数将这些变量传递到各自的视图控制器,(4) 通过 KVC 将它们公开为视图控制器中的属性,以及 (5) 将视图中必要的表列绑定到通过文件所有者的阵列控制器。结果什么也没出现,但也没有错误。如果其中一种方法是首选方法,我可以提供更多详细信息以帮助查看我是否做错了。
提前致谢!
编辑:我确实看过这个相关问题,并且他们似乎正在使用单独的实例NSArrayController
如果我理解正确的话,每个 NIB 文件都有 s ,从设计的角度来看这似乎没有意义,但也许我错了?
第 1 部分:您当然可以做到这一点。我想说这是一个偏好问题。就个人而言,如果要在窗口中同时显示视图,我会将它们保留在同一个笔尖中。*不过,模块化也是一件好事。
第 2 部分:实际上,您可以将阵列控制器放在您喜欢的任何位置。您唯一需要担心的是获取每个对象所需的对您希望其拥有的信息的引用。如果你想要我的 2 美分,我会说将每个都放在笔尖中,并在视图中显示其内容。这将使你的详细视图设置更加困难,但它继续了你似乎想要的模块化。
您必须记住,笔尖中的每个对象都是一个真实的实例。 nib 会为您分配并初始化它们;如果你放一个MyClass
一个笔尖中的物体,以及一个MyClass
另一个笔尖中的对象,这些是two 不同的对象。对于 nibs 来说,有时这是一件棘手的事情:自动为您创建实例确实很方便,但是当您想要跨 nibs 执行操作时,这也意味着需要对引用进行一些摆弄。
听起来你把实例WarehouseView
and WarehouseDetailView
到您的个人笔尖和 MainMenu.nib 中,并期望它们是相同的对象。不会是这样的。您必须将笔尖中的对象链接到它们已经知道的对象。您必须根据您的具体情况来解决这个问题。
我不知道你的模型存储在哪里,也不知道你如何加载笔尖。不过,无论哪个对象执行加载操作,都可能是单个笔尖和应用程序其余部分之间的链接。这就是 nib 中文件所有者代理对象的用途——它为您提供了一个将 nib 中的对象与它们不知道的代码挂钩的位置。
*:如果您发现在 IB 中未将视图包含在拆分视图中,则可以更轻松地布局视图,您可以自行设置它们:将自定义视图对象放入 MainMenu.xib 窗口中,然后可以在它自己的 IB 窗口(尽管它不会位于应用程序的窗口中)。然后在某些内容中设置分割视图的子视图awakeFromNib
.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)