UINavigationController每个页面都有UIToolbar

11
我有一个运行在 UINavigationController 上的应用程序。现在我想在每个屏幕底部添加一个 UIToolbar 元素。底部的工具栏应该是可定制的,以适应当前显示的 ViewController。我的第一个想法是将工具栏简单地添加到 navigationController 视图并打标签,在 viewController 中我认为我将能够检索到 UIToolbar 元素。我有以下代码:
在我的 AppDelegate 中:
// Get instance of Toolbar  (navController is an instance of UINavigationController and TOOLBAR_TAG a constant)
UIToolbar *toolbar = [[UIToolbar alloc] initWithFrame:CGRectMake(0, 440, 320, 40)];
toolbar.tag = TOOLBAR_TAG;
[navController.view addSubview:toolbar];

在我的视图控制器中,我尝试了这个:

UIToolbar *toolbar = [self.navigationController.view viewWithTag:TOOLBAR_TAG];
toolbar.barStyle = UIBarStyleBlack;

然而,这会给我一个错误,说我的工具栏在这种情况下是一个“UILayoutContainerView”对象,而不是一个UIToolbar对象。因此,这个想法似乎是走不通的。

其他人是如何解决这个问题的?

3个回答

42

UINavigationController已经有了一个工具栏。只需使用

[self.navigationController setToolbarHidden:NO];

在最顶层的视图控制器中

[self setToolbarItems:items];

在你所有的视图控制器中,其中 items 是该视图控制器工具栏项的 NSArray

编辑:至于为什么你的解决方案不起作用:你的 TOOLBAR_TAG 可能不是唯一的,这就是为什么你会得到另一个子视图。但正如我所说,你应该使用包含的工具栏。


1
哇,这是我没有想到的服务,我甚至搜索了文档,但没有找到这个。非常酷,谢谢! - Robin
不用谢。=)顺便提一下,这在UINavigationController文档中有提到:http://developer.apple.com/iphone/library/documentation/UIKit/Reference/UINavigationController_Class/Reference/Reference.html#//apple_ref/occ/instp/UINavigationController/toolbar - Can Berk Güder
1
你可以重写UINavigationController的pushController方法,避免复制/粘贴,并在此处设置工具栏项目。 - Thomas Decaux
如何让它在iPad上运行?我正在使用SplitView和导航控制器。在iPad上工具栏从未显示过,但在iPhone上可以。我做错了什么吗? - Harshad Kale

1

为了方便显示UINavigationController底部工具栏,您可以点击“显示工具栏”复选框,该复选框可从选择了“导航控制器”对象的检查器中访问。希望这可以帮到您 :)


0
从设计角度来看,除非您知道工具栏将出现在堆栈中的每个视图中,否则我不建议这样做。一旦您开始为堆栈中的不同视图隐藏/显示工具栏,您会发现该动画(工具栏随着视图滑入/滑出)不会像您预期的那样进行动画处理。
如果您需要特定视图的工具栏,请将它们放在这些视图中,因为工具栏是与视图相关而不是与整个导航栈相关的上下文。

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