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

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

作者: leesum | 来源:发表于2019-11-08 10:45 被阅读0次
    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 从多级页面返回到首页的正确姿势

          本文链接:https://www.haomeiwen.com/subject/nqnnectx.html