Segue至嵌入Tab与Navigation Controller的视图控制器问题求助
解决Segue跳转后Tab Bar不显示的问题
嘿,我之前也碰到过一模一样的坑!这大概率是因为你跳转的层级逻辑没理顺——Tab Bar Controller得作为视图层级里的顶层容器之一,要是直接把VC2 push到VC1的导航栈里,它就脱离了Tab Bar的管辖范围,自然就看不到Tab Bar了。下面分Storyboard和代码两种方案给你讲清楚怎么解决:
方案一:用Storyboard实现
先确认层级结构
确保你的Storyboard是标准嵌套结构:Tab Bar Controller→ 每个标签页对应一个Navigation Controller→ 最后才是具体的VC(比如VC2得是某个Navigation Controller的根控制器,而这个Navigation又是Tab Bar的子项)。正确设置跳转逻辑
别直接给VC1和VC2加Segue!正确的做法是:- 给你的Tab Bar Controller设置一个Storyboard ID(比如叫
MainTabBar),在Identity Inspector面板里就能设置。 - 在VC1的按钮点击事件里,通过代码获取Tab Bar Controller,然后切换到VC2对应的标签:
@IBAction func jumpToVC2(_ sender: UIButton) { // 从Storyboard获取Tab Bar Controller let tabBar = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "MainTabBar") as! UITabBarController // 设置选中VC2所在的标签索引(比如第2个标签,索引是1) tabBar.selectedIndex = 1 // 如果VC1在导航栈里,用push;否则用present self.navigationController?.pushViewController(tabBar, animated: true) // 或者 self.present(tabBar, animated: true) } - 如果VC1本身就在Tab Bar的导航栈里,那更简单,直接调用:
这样就会直接切换到VC2,Tab Bar和Navigation Bar都会正常显示。self.tabBarController?.selectedIndex = 1
- 给你的Tab Bar Controller设置一个Storyboard ID(比如叫
方案二:纯代码实现
先搭建正确的视图层级
确保Tab Bar是顶层容器,每个标签页嵌套Navigation Controller:// 创建VC1和对应的导航 let vc1 = VC1() let nav1 = UINavigationController(rootViewController: vc1) nav1.tabBarItem = UITabBarItem(title: "首页", image: UIImage(systemName: "house"), tag: 0) // 创建VC2和对应的导航 let vc2 = VC2() let nav2 = UINavigationController(rootViewController: vc2) nav2.tabBarItem = UITabBarItem(title: "我的", image: UIImage(systemName: "person"), tag: 1) // 组装Tab Bar Controller let tabBarController = UITabBarController() tabBarController.viewControllers = [nav1, nav2] // 设置为根控制器 window?.rootViewController = tabBarController window?.makeKeyAndVisible()在VC1中实现跳转
按钮点击时直接切换Tab Bar的选中索引即可:@IBAction func goToVC2(_ sender: UIButton) { self.tabBarController?.selectedIndex = 1 }
避坑提醒
- 绝对不要直接给VC1和VC2创建push类型的Segue!这种做法会把VC2直接加入VC1的导航栈,完全脱离Tab Bar的层级,必然导致Tab Bar消失。
- 如果你的场景是从一个非Tab Bar的页面(比如启动页)跳转到VC2,一定要先跳转至Tab Bar Controller,再设置选中索引,而不是直接跳转VC2。
内容的提问来源于stack exchange,提问作者Jov
相关产品推荐
相关产品推荐

