设置UINavigationController的工具栏项目

7
在iPhone OS 3.0中,您可以使用setToolbarItems:animated:方法设置UINavigationController的工具栏项。但是,这需要您传递一个UIToolbarItems数组。虽然我可以在代码中创建这些工具栏项,但如果可能的话,我宁愿在Interface Builder中创建它们。
考虑到这一点,我在“MyGreatViewController.xib”中创建了一个UIToolbar,并用所需的工具栏项填充它。然后,在“MyGreatViewController.m”中,我从工具栏中获取项目并将其传递给setToolbarItems:animated:
- (void)viewDidLoad {
    [super viewDidLoad];
    [self setToolbarItems: [toolbar items]];
}

...其中toolbar是指向UIToolbar的IBOutlet。

这个方法可行吗?有更好的实现方式吗?还是应该通过编程创建这些项?


我不理解某些事情:你说“我从工具栏获取项目”,但是你又把它们还给了工具栏?它们不是已经显示出来了吗? - Oscar
2个回答

12

我不知道这是否有记录,但我在Interface Builder中发现,如果你启用导航控制器的工具栏(toolbar),则可以将工具条项(bar items)拖到你的视图控制器中,它们将自动显示在导航控制器的工具栏中。

例如,在Snow Leopard上使用Xcode 3.2,我们可以这样做:

  1. 选择“文件”-〉“新建项目”。选择基于导航控制器的应用程序并创建项目。
  2. 在Interface Builder中打开MainWindow.xib
  3. 选择导航控制器,在属性检查器中勾选“显示工具栏”框。这将使一个工具栏对象出现。
  4. 从库中将一个工具条按钮项目(Bar Button Item)拖到工具栏中。它将出现在工具栏中。如果你在NIB中检查层次结构,你会发现这个新项目是RootViewController的子类。

似乎任何添加为导航项(navigation item)的子项的工具条按钮项目都会显示在导航栏中,而任何添加为视图控制器的子项的工具条按钮项目都会显示在工具栏中。

(我偶然发现了这一点。如果有人能找到这种行为的文档或任何附加信息,我想了解。)


我相信这就是它应该的方式。有点像UIViewController如果有匹配的文件名,就会神奇地加载它的xib一样。 - Sneakyness
它有效了!我认为这绝对是在导航视图中设置工具栏的最佳方式。 - Nathan
在我的应用程序中,我有一个选项卡控制器,其中一个选项卡是导航控制器 - 这是相当标准的配置。但是,如果我按照Kristopher所建议的去做,在第3步之后,工具栏会出现在IB中的选项卡栏后面!而且,当我尝试进行第4步(我试图添加分段控件/按钮)时,它就不允许我将其拖放到工具栏上。我错过了什么吗? - Dev
4
我知道这很老,但你有没有想法如何对RootViewController的子视图执行此操作?换句话说,如果在RootViewController的代码中我创建了一个在自己nib中的FooController并将其推送,那么我如何在Interface Builder中设置FooController的工具栏按钮? - iand675
@iand675 我同意,我也想知道是否有一种方法可以使用IB来实现这个。 - Nik

4

这是一种完全可行的方式,但请注意,在iPhone上加载xib文件相当昂贵,以编程方式在您的viewDidLoad方法中创建工具栏项可能会更快。


3
好的。既然在创建视图控制器文件时选中了“使用 XIB 用户界面”,XIB 文件已经在视图控制器类初始化时被加载,因此这种方法的成本不应该比以编程方式创建工具栏项更高。 - Steve Harrison
啊,如果你已经在加载XIB文件,那么不会增加太多额外的时间。从XIB文件中解档对象比在代码中创建它们更昂贵,但除非你的视图需要花费很长时间才能加载,否则我不会担心它。 - iKenndac

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接