如何正确实现带导航控制器的选项卡控制器

55
我正在使用Storyboard和Xcode 6。 我的Storyboard中有以下控制器和场景: - UINavigationController作为根视图控制器,其下面是HomeViewController - HomeViewController有一个按钮,可以"显示(例如推出)"UITabBarController - UITabBarController包含4个UIViewControllers。
但是我的问题是,在我展示UITabBarController之后,在4个UIViewControllers中没有导航栏。但是,我认为如果我“显示(例如推出)”UITabBarController,那么它应该有嵌入的导航控制器,这是Storyboard中的初始控制器,对吗?如果是这样,我该如何在Storyboard中设置导航栏?因为我在推出的选项卡栏上并没有看到任何默认的导航栏。我选择了UIViewController,将模拟指标在身份检查器中设置为顶部属性的透明导航栏,但我认为它应该自动添加到此控制器和选项卡栏中,而无需其他步骤。
或者,我应该为每个选项卡条目添加新的导航控制器,以便它们具有自己的根视图控制器?
最主要的问题是为什么我在通过显示(例如推出)时在Storyboard中看不到导航栏。例如,如果我添加导航控制器,然后将其设置为tab bar controller的根,那么Xcode会自动添加顶部导航栏,但是如果队列有一个额外的步骤,如我的HomeViewController,则顶部导航栏永远不会自动出现。
3个回答

157

嗨,你需要将选项卡中的每个视图控制器嵌入到其自己的导航控制器中。因此,流程如下(HomeVC 嵌入了它自己的 NavController 中):

                                         / --> `NavController` --> `ViewController1`
                                         | --> `NavController` --> `ViewController2`
`HomeViewController`-->`TabBarController`|--> `NavController` --> `ViewController3`
                                         \--> `NavController` --> `ViewController4`
  1. 进入 Editor --> Embed In --> Tab Bar Controller(或导航控制器)

如何正确嵌入

回答您的问题:

选项卡栏控制器界面的每个选项卡都关联着一个自定义(不同的)视图控制器。当用户选择特定的选项卡时,选项卡栏控制器会显示相应视图控制器的根视图,替换任何先前的视图。

所以选项卡的根视图控制器必须与导航控制器相连;为了使视图控制器继承导航控制器,导航视图控制器必须在下一行。选项卡栏控制器可以切换到任何下一行的视图。

此文档将帮助概述更多相关信息。https://developer.apple.com/documentation/uikit/uitabbarcontroller


@Cœur - 不是破碎的,只是语法错误 :-) 感谢您指出。希望答案对您有所帮助。 - App Dev Guy
在这种情况下,为什么TabBarController嵌入到导航控制器中? - themaxgoldman
1
因为OP问如何显示(segue)到带有导航控制器的选项卡栏,所以示例就是这样做的 :-) - App Dev Guy
我们如何为tabviewcontroller中的每个控制器设置标题,考虑到tabviewcontroller位于导航控制器中。 - Nipun Arora
@NipunArora - 导航控制器在选项卡栏控制器内部。如果您正在从导航控制器呈现选项卡栏控制器,则应考虑模态呈现而不是推送。 - App Dev Guy
1
我在gif上看得很吃力,但是最左边的视图上必须勾选“Is Initial View Controller”复选框,这样“HomeViewController”才会得到复选框。这里有一张更高分辨率的截图,显示了我最后的结果。 - jrh

21

在Swift 2中,Xcode 7有一个非常方便的功能可以添加一个UINavigationController:

  1. 选择用作“tab”的UIViewController UITabBarNavigationController
  2. 在Xcode菜单栏上选择“Editor” ->
  3. “嵌入” ->
  4. “导航控制器”

    输入图像描述


8
其实不需要使用 Xcode 7 或者 Swift,因为这个功能从一开始就在 Xcode 中存在。 :) - Michael

1
如果您想要类似以下的东西:
TabBarController -> Navigation Controller -> 带有表格视图的视图控制器 -> 从表格视图到主细节视图
例如:
我曾经遇到这样的问题,即主细节视图中没有导航(没有返回按钮到带有表格视图的视图控制器)。
解决方法是:
在表格视图和主细节视图之间设置Segue为:类型:Push(已弃用) 运行您的应用程序......希望您能看到返回按钮......将类型更改为Show(例如Push),再次运行->它应该可以工作。

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