鉴于我有 rootViewController
,它是 UIApplication.shared.delegate?.window??.rootViewController
,我想获取事件的导航 Controller ,如果有的话。
到目前为止我想出的是:
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
这就足够了吗?合作给了我这个解决方案,但我不明白的部分是 rootViewController?.presentedViewController
。不应该是 rootViewController?.presentingViewController
吗?
最佳答案
使用下面的扩展来获取最顶部或当前可见的 UIViewController
和 UINavigationController
。
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
}
}
如何使用?
let objViewcontroller = UIApplication.topViewController()
或
let objNavigationController = UIApplication.topNavigation()
关于ios - 获取当前导航 Controller 的正确方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51625024/