基于RXSwift 下 页面跳转进行解耦 非ViewController类实现页面跳转优化 二

基于RXSwift 下 页面跳转进行解耦 非ViewController类实现页面跳转 

基于我之前文章做法在部分项目中无法正常跳转,或者是调转到当前视图的底层去了

后来发现究其原因就是UITabbarController与UINavigationController相互嵌套使用导致的

所以以下代码就不在起作用了,或者在某些页面将视图加载错了位置,主要原因是 UINavigationController 在入栈的过程中加入UITabbarController,而UITabBarController的下一级控制器是其子控制器,可以有多个子控制器,默认子控制器展示   的顺序从第一个依次排放展示;UINavigationController的下一级控制器是其rootViewController,且只有一个根控制器。 当UITabBarController作为window的根控制器时,其子控制器可以是UINavigationController,也可以是普通控制器,也可以是两种类型的控制器都存在;但是在界面的效果是不一样的。当子控制器是UINavigationController时,其对应的界面会在屏幕的上方显示nav导航栏,并且不同的UINavigationController子控制器的nav导航栏可以设置不同的显示内容;而子控制器是普通控制器的界面不会展示nav导航栏。

 当UINavigationController作为window的根控制器时,其rootViewController只能从UITabBarController和普通控制器中选择一种类型,因为器其rootViewContrlller只有一个。当选择UITabBarController时,而UITabBarController的子控制器在各自的控制器界面展示时,公有一个相同的nav导航栏在屏幕的上方,其内容是固定的,也是一样的。在屏幕的下方展示的是UITabBarController的子控制器

方法一  

   class func on_navigate_page(_ selectedCon:UINavigationController,_ viewCon:UIViewController, animated:Bool)->(){

        var parent = selectedCon.topViewController
        while (parent?.presentedViewController != nil) {
            parent = parent?.presentedViewController!
            if let tabCon = parent as? UITabBarController {
                if let selectedCon = tabCon.selectedViewController as? UINavigationController{
                    if selectedCon.presentedViewController == nil{
                        selectedCon.pushViewController(viewCon, animated: animated)
                         print("我在走 4 : \(common.share.getNowTime())")

                    }else{
                        self.on_navigate_page(selectedCon, viewCon, animated: animated)
                        print("我在走 5 : \(common.share.getNowTime())")

                    }
                }
            }else if(parent is UINavigationController ){
                self.on_navigate_page(parent as! UINavigationController, viewCon, animated: animated)
                 print("我在走 6 : \(common.share.getNowTime())")
            }else{
                selectedCon.pushViewController(viewCon, animated: animated)
                print("我在走 7 : \(common.share.getNowTime())")
            }
        }
    }

这方法个导致闪退,原因是因为这个页面可能被跳转了多次,导致入栈异常。感觉还是在于个人对这种循环递归掌握不好,望大神指点

 

方法二(就是对一进行了拆分)解决了上述闪退的问题。

  // 通用的导航到视图
    class func navigateToPage(_ viewCon:UIViewController, animated:Bool) -> () {
        let rootCon = UIApplication.shared.keyWindow?.rootViewController

        if let tabCon = rootCon as? UITabBarController {
            if let selectedCon = tabCon.selectedViewController as? UINavigationController{
                if selectedCon.presentedViewController == nil{
                     selectedCon.pushViewController(viewCon, animated: animated)
                }else{
                    self.on_navigate_push(selectedCon, viewCon, animated: animated)
                }
            }
        }else if let navigationCon = UIApplication.shared.keyWindow?.rootViewController as? UINavigationController{
            navigationCon.navigationController?.pushViewController(viewCon, animated: animated)
        }else {

            let newNavigationCon = UINavigationController.init(rootViewController: rootCon!)
            newNavigationCon.navigationController?.pushViewController(viewCon, animated: animated)
        }
    }



    /// 第一层
    ///
    /// - Parameters:
    ///   - selectedCon: UINavigationController
    ///   - viewCon: UIViewController
    ///   - animated: animated
    class func on_navigate_push(_ selectedCon:UINavigationController,_ viewCon:UIViewController, animated:Bool){

        var parent = selectedCon.topViewController

        if parent?.presentedViewController != nil{
            parent = parent?.presentedViewController!
            if let tabCon = parent as? UITabBarController {
                if let selectedCon = tabCon.selectedViewController as? UINavigationController{
                    if selectedCon.presentedViewController == nil{
                        selectedCon.pushViewController(viewCon, animated: animated)
                        print("我在走push 1 : \(common.share.getNowTime())")

                    }else{
                        self.on_navigate_push(selectedCon, viewCon, animated: animated)
                        print("我在走push 2 : \(common.share.getNowTime())")

                    }
                }
            }else if(parent is UINavigationController){
                self.on_navigate_push(parent as! UINavigationController, viewCon, animated: animated)
                print("我在走push 3 : \(common.share.getNowTime())")
            }else if (parent?.presentedViewController != nil){
                self.on_navigate_push(parent! , viewCon, animated: animated)
            }else{
                selectedCon.pushViewController(viewCon, animated: animated)
                print("我在走push 4 : \(common.share.getNowTime())")
            }
        }
    }


     /// 第二层
     ///
     /// - Parameters:
     ///   - selectedCon: UIViewController
     ///   - viewCon: UIViewController
     ///   - animated: animated
    class func on_navigate_push(_ selectedCon:UIViewController,_ viewCon:UIViewController, animated:Bool){
        var parent  = selectedCon

        if parent.presentedViewController != nil{
            parent = parent.presentedViewController!
            if let tabCon = parent as? UITabBarController {
                if let selectedCon = tabCon.selectedViewController as? UINavigationController{
                    if selectedCon.presentedViewController == nil{
                        selectedCon.pushViewController(viewCon, animated: animated)
                        print("我在走push 1 : \(common.share.getNowTime())")

                    }else{
                        self.on_navigate_push(selectedCon, viewCon, animated: animated)
                        print("我在走push 2 : \(common.share.getNowTime())")

                    }
                }
            }else if(parent is UINavigationController){
                self.on_navigate_push(parent as! UINavigationController, viewCon, animated: animated)
                print("我在走push 3 : \(common.share.getNowTime())")
            }else{
//                selectedCon.pushViewController(viewCon, animated: animated)
                print("我在走push 4 : \(common.share.getNowTime())")
            }
        }
    }

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章