如何以正确的方式使用导航控制器实现标签栏控制器

Posted

技术标签:

【中文标题】如何以正确的方式使用导航控制器实现标签栏控制器【英文标题】:How to implement tab bar controller with navigation controller in right way 【发布时间】:2014-12-11 11:41:50 【问题描述】:

我正在使用 Storyboard 和 Xcode 6。我的 Storyboard 中有下一个控制器和场景:

UINavigationControllerHomeViewController 为根。 HomeViewController 有一个按钮 Show (e.g. Push) UITabBarControllerUITabBarController 有 4 个 UIViewControllers

但我的问题是,在我显示 UITabBarController 后,4 UIViewControllers 中没有导航栏。但我想如果我Show (e.g. Push)UITabBarController 应该有嵌入式导航控制器,它是情节提要中的初始控制器。我对吗?如果是这样,我该如何在 Storyboard 中设置导航栏,因为我在 Storyboard 上看到的推送标签栏中现在有默认栏事件。我已选择 UIViewController 并将身份检查器中的模拟指标设置为 Top 属性的半透明导航栏,但我认为它应该自动添加到此控制器和标签栏,而无需额外步骤。

或者我应该为每个具有根视图控制器的标签栏项目添加新的导航控制器?

主要问题是为什么我在情节提要中使用 show(例如 Push)看不到导航栏。例如,如果我添加导航控制器,然后设置为根 - 选项卡栏控制器,那么 Xcode 会自动添加顶部导航栏,但如果队列有一个额外的步骤,例如我的 HomeViewController,顶部导航栏永远不会自动出现。

【问题讨论】:

【参考方案1】:

您好,您需要将标签栏中的每个视图控制器嵌入到它自己的导航控制器中。所以流程是这样的(HomeVC 嵌入在它自己的 NavController 中):

                                         / --> `NavController` --> `ViewController1`
                                         | --> `NavController` --> `ViewController2`
`HomeViewController`-->`TabBarController`|--> `NavController` --> `ViewController3`
                                         \--> `NavController` --> `ViewController4`
    转到编辑器 --> 嵌入 --> 标签栏控制器(或导航控制器)

回答您的问题:

标签栏控制器界面的每个标签都与一个自定义(不同 [原文如此])视图控制器相关联。当用户选择特定选项卡时,选项卡栏控制器会显示相应视图控制器的根视图,替换之前的所有视图。

所以选项卡的根视图控制器必须与导航控制器相邻;导航视图控制器必须是下一个内联视图控制器才能继承导航。 Tab Bar 将视图切换到下一个内联的视图。

本文档将帮助概述有关它的更多信息。 https://developer.apple.com/documentation/uikit/uitabbarcontroller

【讨论】:

@Cœur - 没有损坏,只是语法错误 :-) 感谢您指出。希望答案对您有所帮助。 为什么在这种情况下TabBarController嵌入在导航控制器中? @themaxgoldman 因为 OP 询问如何使用导航控制器显示(segue)到标签栏。所以这个例子就是这样做的:-) 如何在tabviewcontroller中为每个控制器设置标题。考虑到 tabviewcontroller 在导航控制器内部。 我很难在 gif 上看到这一点,但是必须在最左侧的视图上选中“是初始视图控制器”复选框,因此“HomeViewController”会得到该复选框。 Here is a higher resolution screenshot 最后的结果。【参考方案2】:

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

    选择用作UITabBarNavigationController 的“选项卡”的 UIViewController 在顶部 Xcode 菜单中,选择“编辑器”-> “嵌入”->

    “导航控制器”

【讨论】:

实际上没有必要拥有 Xcode 7 或使用 Swift,因为这个功能从一开始就在 Xcode 中。 :)【参考方案3】:

如果你想拥有这样的东西:

TabBarController -> Navigation Controller -> View Controller with a Table View -> and from the TableView a MasterDetailView 例如:

我遇到的问题是 MasterDetailView 中没有导航(没有返回按钮到带有 TableView 的 ViewController)。

解决方法是:

将 TableView 和 MasterDetailView 之间的 Segue 设置为: Kind: Push (Deprecated)

运行您的应用程序...希望您会看到返回按钮...将 Kind 更改为 Show (e.g. Push),再次运行 -> 它应该可以工作。

【讨论】:

以上是关于如何以正确的方式使用导航控制器实现标签栏控制器的主要内容,如果未能解决你的问题,请参考以下文章

Swift:以编程方式嵌入标签栏控制器后,导航栏消失

Swift-以编程方式导航控制器和标签栏控制器

以编程方式导航到另一个故事板上的导航控制器和标签栏控制器内的视图控制器

以模态方式将嵌入在导航控制器中的视图控制器与标签栏控制器分开

当以编程方式设置根视图控制器时,导航和标签栏丢失

以编程方式创建 UINavigationController