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