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