将 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
。在viewDidLoad
的ThirdViewController
和FourthViewController
中将其设置为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