之前可能已经提出过这个问题,但是我的google-fu必须不如别人的,因为我无法理解这一点。
我正在玩iPhone SDK,我正在构建一个我一直在考虑的概念应用程序。如果我们看一下使用基于导航的应用程序生成的骨架,MainWindow.xib包含一个导航控制器,并在其中包含一个根视图控制器(如果你稍微玩一下,还有一个导航栏和工具栏)。根视图控制器具有与之关联的RootViewController-nib,用于加载表视图。
到目前为止一切顺利。要将内容添加到工具栏和导航栏,我应该将它们添加到根视图控制器下面的层次结构中(这没有问题)。但是,我无法弄清楚的是,这仍然在MainWindow.xib中(或者,在运行时,nib)。如何定义xib以便从中获取工具栏项?
我想做(相当于,只是在这里重复使用这个名字)
RootViewController *controller = [[RootViewController alloc] initWithNibName:nil bundle:nil];
[self.navigationController pushViewController:controller animated:YES];
[controller release];
并在该笔尖中定义的工具栏项目上获取导航控制器。放置它的逻辑位置将在File的所有者(类型为RootViewController)下的层次结构中,但似乎不可能。
目前,我正在viewDidLoad
方法中手动分配这些(navigationItem和toolbarItems),或者直接在MainWindow.xib中定义它们以便在应用初始化时加载。
有什么想法吗?
我想我会尝试用图片来解释。这是主窗口的Interface Builder,几乎就是从向导中创建基于导航的项目。为了清楚起见,我添加了一个工具栏项目。您可以看到导航控制器,工具栏和导航栏以及根视图控制器。
IB Screenshot http://img526.imageshack.us/img526/3507/rootviewcontroller.png
基本上,根视图控制器有一个条形按钮项和一个导航项,如您所见。问题是,它还有一个与它关联的nib,当它被加载时将实例化一个视图,并将它分配给控制器的视图出口(在该nib中是File的所有者,类型为RootViewController,应该是)。
如何将工具栏项和导航项放到另一个nib,RootViewController.nib中,以便我可以在这里删除它们。 RootViewController.nib将其他所有内容添加到Root View Controller,为什么不将这些项添加?
这样做的背景是我想简单地实例化RootViewController,用它自己的nib初始化它(即上面显示的initWithNibName:nil),然后将它推到导航控制器上,而不必在编码中添加导航/工具栏项(正如我现在所做的那样)。
答案 0 :(得分:0)
首先,你提出问题的方式在这里有点令人困惑,但我想我明白了。
你在这里有几个选择。如果要设计工具栏,只需在要加载的视图中添加一个工具栏,然后在Interface Builder中将各种按钮和分隔符拖到其上。然后在该视图的视图控制器中创建IBActions,并将工具栏项目中的连接拖动到各种操作。但是,由于您正在使用导航控制器,因此当您选择UINavigationController时(IB检查器中的“属性”选项卡),您将希望隐藏默认情况下通过取消选中MainWindow.xib中“显示工具栏”框的工具栏。
alt text http://cimgf.com/files/toolbarthing.png
或者,您可以通过调用[self setToolbarItems:items]在viewDidLoad方法中以编程方式添加工具栏项;其中items是工具栏项的NSArray。
我真的无法让导航控制器使用您的自定义工具栏。只需隐藏主要的一个并使用您的自定义。