URLNavigator 是个模块之间解耦的好帮手。但最近遇到问题是在程序退出后,大概4个小时不使用,重新打开APP时,所有采用url跳转的全失效了。但等杀死进程重新启动一切正常了。网上有介绍不设置 Main Interface(当然这个是必要的),可对于这个问题还是没能得到解决。
跟踪了代码结合网上 评论 发现在寻找顶层控制器时候没找到。所以 navigator.push("") 返回了nil所导致。
解决办法自定义MyNavigator类(没有继承),把Navigator作为属性。再重写push方法。
class MyNavigator: NSObject {
let navigator = Navigator()
///跳转
func push(_ url: URLConvertible)
{
let vc = navigator.push(url)
//这里push后返回的nil,导致无法跳转,所以采用其他处理方式
if vc == nil{
self.showVCByUrl(url, context: nil)
}
}
///重新跳转思路
func showVCByUrl(_ url: URLConvertible, context: Any?){
//1调用第三方方法,根据url获取需要跳转的控制器
let vc = navigator.viewController(for: url, context: context)
//2自定义寻找当前顶层控制器的NavigationController,push(vc)
//3如果没找到NavigationController,则找到顶层控制器presentVC(vc)
}
}
完整代码
///重新弹出
private func showVCByUrl(_ url: URLConvertible, context: Any?){
let vc = navigator.viewController(for: url, context: context)
if vc == nil{
return
}
self.showVC(vc!)
}
///根据一个控制器来跳转
private func showVC(_ vc:UIViewController){
//若有navigationController则push
if let navigation = self.topNaVC(){
navigation.pushViewController(vc, animated: true)
}else{//否则present
let navigationVC = QMUINavigationController(rootViewController: vc)
let window = UIApplication.shared.keyWindow
window?.rootViewController?.presentVC(navigationVC)
}
}
/**
获取当前活动的navigationcontroller
(这个寻找方法还有待优化,不是严谨的,
因为当前显示的页面可能是prent出来的,要多层寻找)
*/
private func topNaVC() -> UINavigationController? {
let window = UIApplication.shared.keyWindow
guard window != nil else {
return nil
}
if window!.rootViewController!.isKind(of: UITabBarController.self){
let tabBarVC = window!.rootViewController as! UITabBarController
let vc = tabBarVC.selectedViewController as? UINavigationController
return vc
}
return nil
}
万幸的是当前项目获取第三方 Navigator()方法都是一个appDelegate的全局方法。所以替换这个方法返回MyNavigator对象即可。
网友评论