1.功能原型
在tabIndex=2的tab栏下, push了多级页面, 此时该页面有个按钮,点击回到首页(tabIndex=0的首页)
2.解决问题分析
思路1: 先pop到tabIndex=2的根VC下, 然后再修改tabBarController?.selectedIndex = 0
具体代码:
self.navigationController?.popToRootViewController(animated: true)
self.tabBarController?.selectedIndex = 0
出现的问题: 只会返回根控制器, tab不会切换
原因: 调用这句代码self.navigationController?.popViewController(animated: true)之后,会把保存在栈内的vc数据清空,只保留栈底的数据(根控制器),所以再执行self.tabBarController?.selectedIndex = 0的时候, self即当前的VC=nil,所以调用不起来;
思路2: 根据思路1的情况, 应该在根控制器内调用self.tabBarController?.selectedIndex = 0, 在根VC内添加监听, 当调用popToRootViewController方法之后,发送通知,根控制器收到通知切换selectedIndex
具体代码:
1.当前VC
/// 跳到首页
@objc private func doJumpHome() {
rx_navgationController?.popToRootViewController(animated: true)
NotificationCenter.default.post(name: NSNotification.Name("JumpHome"), object: nil)
}
2.根控制器
private func setupNotification() {
// 接收跳转到首页的通知
NotificationCenter.default.addObserver(self, selector: #selector(jumpHome), name: NSNotification.Name("JumpHome"), object: nil)
}
@objc private func jumpHome() {
self.tabBarController?.selectedIndex = 0
}
deinit {
NotificationCenter.default.removeObserver(self)
}
出现的问题: 跳转到了首页, 但是底部的tabbar隐藏了
原因: 我也不太清楚
3.正确的做法:
- 方法一: 思路2的做法, 只需要先设置通知切换selectedIndex = 0, 再popToRootViewController
具体代码:
在当前控制器内
/// 跳到首页
@objc private func doJumpHome() {
NotificationCenter.default.post(name: NSNotification.Name("JumpHome"), object: nil)
rx_navgationController?.popToRootViewController(animated: true)
}
- 方法二: 直接在当前控制器设置selectedIndex=0, 再popToRootViewController, 就完事儿
/// 为了防止tabbar隐藏, 保险起见加一个
self.tabBarController?.tabBar.isHidden = false
self.tabBarController?.selectedIndex = 0
rx_navgationController?.popToRootViewController(animated: true)
可能存在疑惑的地方: self.tabBarController和rootVC.tabBarController拿到的是同一个tabBarController, 一般情况下, 我们的应用是基于一个UITabBarController, 在tabBarController下有四个UINavigationController, nav下有一个rootVC; 如果有多个UITabBarController,情况再具体的说