返回带TabBar的页面时TabBar消失问题求助
问题分析:返回带TabBar的页面时TabBar消失的原因及解决办法
我之前开发iOS APP的时候也碰到过一模一样的TabBar消失问题,太闹心了!咱们来一步步拆解问题根源和解决办法:
问题原因
大概率是你的页面跳转/返回逻辑破坏了TabBarController的层级关联,常见的触发场景有这几个:
- 返回方法用错了:如果跳转是用的
Push类型Segue,结果返回时用了dismiss方法——dismiss是专门用来关闭模态弹出的页面的,用在push进来的页面上会直接跳出原来的导航栈,导致回到的页面脱离了TabBarController的管理,TabBar自然就不显示了。 - Segue跳转类型选错了:要是你把Segue设成了
Present Modally(模态跳转),新页面会完全覆盖原来的TabBar页面。就算dismiss返回,有时候层级混乱也会导致TabBar无法正常渲染。 - 导航栈结构不对:比如你把TabBarController当成普通VC推到了导航栈里,而不是作为导航控制器的根。这种情况下返回时很容易跳错层级,TabBar的显示逻辑直接紊乱。
- 不小心开了隐藏TabBar的属性:如果你的Tour Selection VC里设置了
hidesBottomBarWhenPushed = true,虽然push时隐藏TabBar是正常的,但如果返回时这个属性没自动恢复(或者被代码手动锁死了),TabBar也不会出来。
解决办法
针对不同的原因,对应不同的修复方式:
1. 把返回方法改对
如果页面是通过Show/Push Segue跳进来的,必须用导航栈的pop系列方法返回:
- 用系统默认返回按钮的话,不用改,它默认就是
popViewController; - 要是用了自定义返回按钮,手动写正确的逻辑:
划重点:绝对不要用@IBAction func backButtonTapped(_ sender: UIButton) { // 普通返回上一页 navigationController?.popViewController(animated: true) // 要是想直接回到Tour Selection页面,就遍历导航栈找到目标VC再pop // if let targetVC = navigationController?.viewControllers.first(where: { $0 is TourSelectionVC }) { // navigationController?.popToViewController(targetVC, animated: true) // } }dismiss(animated:)处理push进来的页面!
2. 修正Segue的跳转类型
如果跳转后还要保留TabBar的关联,一定要用Show/Push类型的Segue:
- 打开Storyboard,选中出问题的Segue;
- 在右侧属性面板(Attributes Inspector)里,把
Segue Kind改成Show (e.g. Push); - 这样新页面会被加入当前导航栈,返回时TabBar会自动正常显示。
如果确实需要用模态跳转(比如新页面是全屏弹窗),返回时可以手动指定回到TabBarController:
@IBAction func dismissButtonTapped(_ sender: UIButton) { // 直接dismiss回到原页面 dismiss(animated: true) // 要是还是不显示TabBar,就手动切换到对应的tab // if let tabBarVC = presentingViewController as? UITabBarController { // tabBarVC.selectedIndex = 0 // 这里填Tour Selection对应的tab索引 // dismiss(animated: true) // } }
3. 检查并修正导航栈结构
确保你的层级是正确的:
- 标准结构应该是:
UINavigationController -> UITabBarController -> 各个Tab的VC(包括Tour Selection); - 绝对不要把TabBarController当成普通VC推到导航栈里;
- 要是结构错了,直接在Storyboard里拖拽调整:把UINavigationController的根视图控制器设为UITabBarController,再把Tour Selection加到TabBar的tab项里。
4. 检查hidesBottomBarWhenPushed属性
在Tour Selection VC里加一段代码,确保返回时TabBar不会被隐藏:
override func viewWillAppear(_ animated: Bool) { super.viewWillAppear(animated) // 强制关闭隐藏TabBar的属性 navigationController?.hidesBottomBarWhenPushed = false }
内容的提问来源于stack exchange,提问作者user9459145
相关产品推荐
相关产品推荐

