将 UINavigationController 添加到 UITabBarController 而不在所有视图中显示标签栏

Posted

技术标签:

【中文标题】将 UINavigationController 添加到 UITabBarController 而不在所有视图中显示标签栏【英文标题】:Add UINavigationController to UITabBarController without Tab Bar showing up in all views 【发布时间】:2017-01-13 22:18:26 【问题描述】:

我目前有带有导航控制器的标签栏控制器,如described here。

因此,标签栏显示在每个视图下方。

有没有办法使用 Storyboard 隐藏连续屏幕上的标签栏,这些屏幕不直接连接到标签栏控制器。

当前流程如下图所示:

所需导航示例

例如,“第二视图”应该与导航控制器一起显示,因为它是标签栏控制器的直接子级。

但是,“第三视图”和“第四视图”应该只有导航控制器(没有标签栏):

实际(带有标签栏)与预期(期望的结果是没有标签栏的视图):

不建议的解决方案

获得所需流程的一种可能方法是创建一个导航控制器,然后将其连接到选项卡栏控制器。但是,Apple 不建议将其作为 UI 模式(Apple 文档建议使用上述方法),并且会导致一些细微的错误:

标签栏控制器中的标签消失后,无法再重新排列它们 无法从情节提要中设置“第二视图”的导航标题 Editor > Embed in > Navigation Controller 对于 Tab Bar Controller 显示为灰色(因为不建议这样做),因此您必须手动创建它

【问题讨论】:

我喜欢您的问题如此精确,您可以准确描述您想要实现的目标和问题所在。 你应该将第三个控制器推送到 tabbarviewcontroller 的导航视图控制器 @HMHero 我该怎么做?是不是第三个控制器视图的导航控制器。 【参考方案1】:

UIViewController 有一个属性hidesBottomBarWhenPushed。在viewDidLoadThirdViewControllerFourthViewController 中将其设置为true

更新

您当前的视图控制器层次结构完全没问题。不要将其更改为其他任何内容。

更新 2

你说得对,viewDidLoad 还不够好。使用init?(coder:)

required init?(coder aDecoder: NSCoder) 
    super.init(coder: aDecoder)
    hidesBottomBarWhenPushed = true

或者在 Interface Builder 中设置一个标志。

【讨论】:

我刚试过这个,有点问题。推到导航堆栈上,底部栏仍显示在“第三视图”上,但成功隐藏在“第四视图”上。弹出栈,“第三视图”和“第四视图”都成功隐藏了底栏。 好的,看起来viewDidLoad 在视图周期中为时已晚,在ThirdViewController 的segue 中将hidesBottomBarWhenPushed 设置为true 就可以了。 @user2560886 你说得对,似乎已经晚了。我已经更新了答案。

以上是关于将 UINavigationController 添加到 UITabBarController 而不在所有视图中显示标签栏的主要内容,如果未能解决你的问题,请参考以下文章

将 UIViewController 放在 UINavigationController 堆栈之上

将 UIViewController 添加到 UINavigationController 的问题

如何将 UIView 添加到 UINavigationController 堆栈

将 UINavigationBar 添加到没有 UINavigationController 的 UITableViewController

为啥我们将 UIViewController 传递给 UINavigationController 类?

如何将 CAGradientLayer 应用于 UINavigationController 背景