嵌入NavigationController后UITabBar返回时消失的问题求助
嘿,我来帮你捋捋这个问题~你遇到的情况其实是iOS导航控制器和TabBar控制器配合时的一个常见小坑,咱们先搞清楚根源,再一步步解决:
问题根源
当你在故事板给PurchaseViewController勾选hideBottomBarOnPush后,push操作会隐藏TabBar,但返回时系统偶尔会因为控制器层级的状态缓存,没能自动恢复TabBar的显示——尤其是你的结构是TabBarController嵌套NavigationController再到LessonViewController这种多层级的情况。
下面给你几个实用的解决方法,按推荐程度排序:
方法一:手动控制push时的隐藏属性(最推荐)
放弃故事板的勾选,转而在跳转代码里手动设置hidesBottomBarWhenPushed,这种方式系统对状态恢复的处理更可靠:
在LessonViewController的按钮点击事件里写:
@IBAction func jumpToPurchase(_ sender: UIButton) { // 从故事板获取PurchaseViewController实例 guard let purchaseVC = self.storyboard?.instantiateViewController(withIdentifier: "PurchaseViewController") as? PurchaseViewController else { return } // 手动设置push时隐藏TabBar purchaseVC.hidesBottomBarWhenPushed = true // 执行跳转 self.navigationController?.pushViewController(purchaseVC, animated: true) }
这样设置后,返回LessonViewController时,系统会自动识别并恢复TabBar的显示,不会出现消失的问题。
方法二:在LessonViewController中强制恢复TabBar
如果方法一不适用,也可以在LessonViewController即将显示时,手动强制让TabBar显示:
override func viewWillAppear(_ animated: Bool) { super.viewWillAppear(animated) // 强制显示TabBar self.tabBarController?.tabBar.isHidden = false }
这个方法简单直接,每次当前控制器要显示时,都确保TabBar是可见的,适合快速修复问题。
方法三:检查故事板配置与缓存
从你提供的故事板截图来看,层级是TabBarController → NavigationController → LessonViewController,这个结构是对的,但可以试试这些小操作:
- 清理项目缓存:按下
Command + Shift + K清理编译缓存,再重新构建项目 - 检查
LessonViewController的属性:确保它没有被意外设置hidesBottomBarWhenPushed(不管是代码里还是故事板的属性面板) - 重启Xcode:有时候IDE的缓存会导致奇怪的状态问题
小提醒
如果你是用模态跳转(present)而不是push,hideBottomBarOnPush是不会生效的,但你这里是push跳转,所以不用考虑这个情况~
内容的提问来源于stack exchange,提问作者Harry Stuart

