基於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())")
            }
        }
    }

 

 

 

 

 

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