iOS应用全局固定底部TabBar:非Tab关联页面如何显示TabBar
让TabBar在所有视图控制器中保持显示的解决方案
我之前也碰到过SWRevealViewController搭配TabBarController的类似布局问题,核心要点是让所有需要显示TabBar的页面都处于TabBarController的层级结构内,不能跳出这个容器。下面是具体的实现步骤:
1. 调整基础层级结构
首先得确保你的TabBarController的每个Tab项都包裹在UINavigationController中,而不是直接关联普通的UIViewController。这样每个Tab都有独立的导航栈,后续跳转时TabBar会自动保持显示:
// 示例:创建TabBarController的子控制器 let tab1VC = FirstTabViewController() let tab1Nav = UINavigationController(rootViewController: tab1VC) tab1Nav.tabBarItem = UITabBarItem(title: "首页", image: UIImage(systemName: "house"), tag: 0) let tab2VC = SecondTabViewController() let tab2Nav = UINavigationController(rootViewController: tab2VC) tab2Nav.tabBarItem = UITabBarItem(title: "消息", image: UIImage(systemName: "message"), tag: 1) // 组装TabBarController let tabBarVC = UITabBarController() tabBarVC.viewControllers = [tab1Nav, tab2Nav] // 设置为SWReveal的前置视图 revealViewController.frontViewController = tabBarVC
2. 修改侧边菜单的跳转逻辑
不要直接替换SWReveal的frontViewController,也不要用present方式打开新页面——这两种方式都会让新页面脱离TabBar的层级。正确的做法是在当前选中的Tab导航栈中push新页面:
// 侧边菜单按钮点击事件示例 @objc func openCustomVC() { guard let revealVC = revealViewController, let tabBarVC = revealVC.frontViewController as? UITabBarController, let currentNav = tabBarVC.selectedViewController as? UINavigationController else { return } let customVC = CustomViewController() // 确保这个属性为false(默认就是false,但显式设置避免意外) customVC.hidesBottomBarWhenPushed = false currentNav.pushViewController(customVC, animated: true) // 关闭侧边菜单 revealVC.revealToggle(animated: true) }
3. 特殊场景处理:跨Tab打开页面
如果需要从侧边菜单直接跳转到某个Tab的子页面(比如从侧边菜单打开Tab2的详情页),可以先切换Tab,再在对应导航栈中push:
@objc func jumpToTab2Detail() { guard let revealVC = revealViewController, let tabBarVC = revealVC.frontViewController as? UITabBarController, // 获取Tab2的导航控制器 let tab2Nav = tabBarVC.viewControllers?[1] as? UINavigationController else { return } // 切换到Tab2 tabBarVC.selectedIndex = 1 // push详情页 let detailVC = DetailViewController() tab2Nav.pushViewController(detailVC, animated: true) revealVC.revealToggle(animated: true) }
关键注意点
- 永远确保新页面是被push到TabBarController下属的导航栈中,不要脱离这个容器。
- 检查所有自定义ViewController的
hidesBottomBarWhenPushed属性,必须设置为false,否则push时TabBar会被隐藏。 - 不要用
present方式打开需要显示TabBar的页面,模态窗口默认不会显示父容器的TabBar。
内容的提问来源于stack exchange,提问作者Awais
相关产品推荐
相关产品推荐

