鉴于我有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吗?
使用下面的扩展来抓取最顶部或当前可见的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
}
}
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)
| 归档时间: |
|
| 查看次数: |
2458 次 |
| 最近记录: |