设置 UINavigationController 的工具栏项
Posted
技术标签:
【中文标题】设置 UINavigationController 的工具栏项【英文标题】:Setting Toolbar Items of UINavigationController 【发布时间】:2009-08-22 09:16:15 【问题描述】:在 iPhone OS 3.0 中,您可以使用 setToolbarItems:animated:
方法。但是,这需要您传入一组 UIToolbarItems。虽然我可以通过编程方式创建这些工具栏项,但如果可能的话,我宁愿在 Interface Builder 中创建它们。
考虑到这一点,我在“MyGreatViewController.xib”中创建了一个 UIToolbar,并在其中填充了所需的工具栏项。然后,在“MyGreatViewController.m”中,我从工具栏中获取项目并将它们传递给setToolbarItems:animated:
:
- (void)viewDidLoad
[super viewDidLoad];
[self setToolbarItems: [toolbar items]];
...其中toolbar
是一个引用 UIToolbar 的 IBOutlet。
这是一个好方法吗?有没有更好的方法来实现这一点?我应该只以编程方式创建项目吗?
【问题讨论】:
我有什么不明白的地方:你说“我从工具栏获取项目”,然后你把它们还给工具栏?不是已经显示了吗? 【参考方案1】:我不知道这是否记录在任何地方,但我发现在 Interface Builder 中,如果启用导航控制器的工具栏,则可以将栏项目拖动到视图控制器,它们会自动显示在导航控制器的工具栏。
例如,我们可以这样做(在 Snow Leopard 上使用 Xcode 3.2):
-
File->New Project....选择Navigation-based Application并创建项目。
在 Interface Builder 中打开
MainWindow.xib
。
选择导航控制器,然后在属性检查器中,选中“显示工具栏”框。这将导致工具栏对象出现。
将条形按钮项从库中拖到工具栏上。它将出现在工具栏中。如果您检查 NIB 中的层次结构,您会发现这个新项目是 RootViewController
的子项。
似乎任何添加为导航项子项的条形按钮项都将显示在导航栏中,并且任何添加为视图控制器子项的条形按钮项都将显示在工具栏中。
(我偶然发现了这一点。如果有人能找到有关此行为的文档或任何其他信息,我很想听听。)
【讨论】:
我相信这就是它应该的方式。有点像UIViewController
神奇地加载它的 xib,如果它有一个匹配的文件名。
有效!我认为这绝对是在导航视图中设置工具栏的最佳方式。
在我的应用程序中,我有一个选项卡栏控制器,其中一个选项卡是一个导航控制器——非常标准的配置。但是,如果我按照 Kristopher 的建议进行操作,则在第 3 步之后,工具栏会出现在 IB 的选项卡栏后面!当我尝试第 4 步(我尝试添加段控件/按钮)时,它只是不允许我将它放在工具栏上。我在这里错过了什么吗?
我知道这已经很老了,但是您知道如何为 RootViewController 的子视图执行此操作吗?换句话说,如果在 RootViewController 的代码中我创建了一个位于它自己的 nib 中的 FooController 并推送它,那么如何在 Interface Builder 中设置 FooController 的工具栏按钮?
@iand675 同意,我也想知道 IB 是否有解决方案【参考方案2】:
这是一种完全可以接受的方式,但请记住,在 iPhone 上加载 xib 文件非常昂贵,并且在 viewDidLoad 方法中以编程方式创建工具栏项可能会更快。
【讨论】:
太棒了。由于在视图控制器类初始化时已经加载了 XIB(我在创建视图控制器文件时检查了“使用 XIB 作为用户界面”),这种方法不应该比以编程方式创建工具栏项更昂贵。 啊,如果您已经在加载 XIB,那么您不会增加太多额外的时间。从 XIB 中取消归档对象比在代码中创建它们更昂贵,但除非您的视图需要很长时间才能加载,否则我不会担心。以上是关于设置 UINavigationController 的工具栏项的主要内容,如果未能解决你的问题,请参考以下文章
设置所有 uinavigationcontroller 的高度
设置 UINavigationController 框架不会改变外观
无法在 UINavigationController 上设置后退按钮