如何切换UITabBarItem时将其ViewController重置为默认控制器?
我来给你捋捋怎么实现哈,这场景其实挺常见的,Swift 4里有两种简单靠谱的方案,你可以根据自己的项目结构选:
方案一:自定义TabBarController + 代理方法
这种方法适合统一管理所有Tab的切换逻辑,步骤很简单:
- 先创建一个自定义的
UITabBarController子类,让它遵循UITabBarControllerDelegate协议 - 在
viewDidLoad里把自己设为代理 - 实现代理方法,当选中第一个Tab时,重置它的导航栈到根VC
代码示例:
class CustomTabBarController: UITabBarController, UITabBarControllerDelegate { override func viewDidLoad() { super.viewDidLoad() // 设置代理为自身 self.delegate = self } func tabBarController(_ tabBarController: UITabBarController, didSelect viewController: UIViewController) { // 检查是否选中了第一个Tab(索引从0开始) if tabBarController.selectedIndex == 0 { // 假设第一个Tab的根容器是UINavigationController(一般跳转都是用导航栈push) if let navController = viewController as? UINavigationController { // 重置导航栈到根ViewController,也就是你的defaultViewController(1) navController.popToRootViewController(animated: true) } } } }
方案二:在第一个Tab的根VC里处理
如果不想自定义TabBarController,也可以直接在defaultViewController(1)里处理,利用viewWillAppear方法,当这个VC即将显示时,自动把导航栈切回自己:
代码示例:
class DefaultViewController1: UIViewController { override func viewWillAppear(_ animated: Bool) { super.viewWillAppear(animated) // 检查当前导航栈里的VC数量,如果大于1,说明已经跳转到其他页面了 if let navController = self.navigationController, navController.viewControllers.count > 1 { // 切回根VC navController.popToRootViewController(animated: animated) } } }
特殊情况补充
如果你的跳转不是用导航栈push,而是用present弹出VC(2)的话,那逻辑要稍微调整:
- 用方案一的话,在代理方法里调用
viewController.dismiss(animated: true, completion: nil)就可以回到根VC - 用方案二的话,在
viewWillAppear里调用self.dismiss(animated: animated, completion: nil)就行
内容的提问来源于stack exchange,提问作者amirtmgr
相关产品推荐
相关产品推荐

