Swift 4:如何通过额外UIButton切换UITabBar的Appointments页面且不隐藏TabBar?
嘿,刚上手Swift 4的话,这个需求其实挺常见的,我来给你一步步讲清楚怎么实现~核心思路就是直接操作你的根UITabBarController来切换标签,这是最原生且不会隐藏TabBar的方法。
步骤1:给独立按钮添加点击事件
首先,你需要给你的独立UIButton绑定点击触发的方法。如果是用Storyboard/XIB拖的按钮,记得先把它和ViewController的IBOutlet连接好,然后在viewDidLoad里添加点击事件:
override func viewDidLoad() { super.viewDidLoad() // 替换成你自己的按钮变量名 yourAppointmentButton.addTarget(self, action: #selector(navigateToAppointmentsTab), for: .touchUpInside) }
步骤2:实现导航逻辑
接下来编写点击后触发的方法,核心是获取根TabBarController的引用,然后设置它的selectedIndex来切换到Appointments页面:
@objc func navigateToAppointmentsTab() { // 先获取根视图控制器的TabBarController引用 guard let tabBarController = UIApplication.shared.keyWindow?.rootViewController as? UITabBarController else { print("找不到TabBarController的引用,检查根控制器是否为UITabBarController") return } // 设置选中的标签索引——这里要注意!索引从0开始,比如Appointments是第2个标签的话,就写1 // 你要根据自己的TabBar布局调整这个数字 tabBarController.selectedIndex = 1 // 可选操作:如果Appointments标签对应的是UINavigationController,你可以顺便把导航栈重置到根页面 if let navController = tabBarController.viewControllers?[1] as? UINavigationController { navController.popToRootViewController(animated: true) } }
关键注意点
- 根控制器必须是UITabBarController:如果你的APP根控制器不是它,那你需要调整获取TabBarController的方式(比如通过
navigationController?.parent或者presentingViewController往上找),但最推荐的结构还是把UITabBarController作为根控制器,这样最稳妥。 - 索引值要对应正确:数一下你的Appointments标签在TabBar里的位置,从左到右第一个是0,第二个是1,以此类推,别写错数字哦。
- 如果当前页面是被present出来的:如果你的独立按钮所在的页面是用
present方式弹出的,切换TabBar后可能需要关闭当前页面,只需要在selectedIndex设置完之后加一行:self.dismiss(animated: true, completion: nil)。
为什么这样不会隐藏TabBar?
因为我们是直接调用TabBarController原生的标签切换逻辑,完全遵循它的内部机制,所以TabBar会一直保持显示状态,不会被隐藏。如果用push或者present的方式跳转到目标页面,反而可能会导致TabBar消失,这种方法是最贴合原生行为的解决方案。
内容的提问来源于stack exchange,提问作者Bilal Mughal
相关产品推荐
相关产品推荐

