获取当前导航控制器的正确方法

bar*_*dog 2 ios swift

鉴于我有rootViewControllerwhich is UIApplication.shared.delegate?.window??.rootViewController,我想获取活动导航控制器(如果有)。

到目前为止,我想出了:

guard var controller = rootViewController?.presentedViewController else { return rootViewController as? UINavigationController }
while let presented = controller.presentedViewController {
    controller = presented
}
controller = controller.navigationController ?? controller
return controller as? UINavigationController
Run Code Online (Sandbox Code Playgroud)

这足够了吗?一个共同工作给了我这个解决方案,但我不明白的部分是rootViewController?.presentedViewController. 不应该rootViewController?.presentingViewController吗?

Hit*_*esh 6

使用下面的扩展来抓取最顶部或当前可见的UIViewControllerUINavigationController.

extension UIApplication {
    
    class func topViewController(_ viewController: UIViewController? = UIApplication.shared.keyWindow?.rootViewController) -> UIViewController? {
        if let nav = viewController as? UINavigationController {
            return topViewController(nav.visibleViewController)
        }
        if let tab = viewController as? UITabBarController {
            if let selected = tab.selectedViewController {
                return topViewController(selected)
            }
        }
        if let presented = viewController?.presentedViewController {
            return topViewController(presented)
        }
        return viewController
    }
    
    class func topNavigationController(_ viewController: UIViewController? = UIApplication.shared.keyWindow?.rootViewController) -> UINavigationController? {
        
        if let nav = viewController as? UINavigationController {
            return nav
        }
        if let tab = viewController as? UITabBarController {
            if let selected = tab.selectedViewController {
                return selected.navigationController
            }
        }
        return viewController?.navigationController
    }
}
Run Code Online (Sandbox Code Playgroud)

如何使用?

let objViewcontroller = UIApplication.topViewController()
Run Code Online (Sandbox Code Playgroud)

或者

let objNavigationController = UIApplication.topNavigation()
Run Code Online (Sandbox Code Playgroud)