iOS 从多级页面返回到首页的正确姿势

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.正确的做法:
  1. 方法一: 思路2的做法, 只需要先设置通知切换selectedIndex = 0, 再popToRootViewController
    具体代码:
    在当前控制器内
/// 跳到首页
@objc private func doJumpHome() {
        NotificationCenter.default.post(name: NSNotification.Name("JumpHome"), object: nil) 
        rx_navgationController?.popToRootViewController(animated: true)
}
  1. 方法二: 直接在当前控制器设置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,情况再具体的说

你可能感兴趣的:(iOS 从多级页面返回到首页的正确姿势)