iOS获取窗口当前显示的控制器
在iOS应用中,我们经常需要获取当前窗口显示的控制器(ViewController),比如做一些页面跳转、弹出提示框等操作。本文介绍了几种获取当前窗口控制器的方法。
方法一:获取当前window的rootViewController
if let rootViewController = UIApplication.shared.windows.filter({$0.isKeyWindow}).first?.rootViewController {
// do something with root view controller
}
该方法通过UIApplication的windows数组获取当前显示的window,然后通过判断window的keyWindow属性获取当前的窗口,最后获取该窗口的rootViewController属性即可。
方法二:获取当前view的viewController
extension UIView {
func parentViewController() -> UIViewController? {
var parentResponder: UIResponder? = self
while parentResponder != nil {
parentResponder = parentResponder!.next
if let viewController = parentResponder as? UIViewController {
return viewController
}
}
return nil
}
}
该方法是通过对UIView进行扩展(extension),实现了parentViewController方法,该方法遍历view的父视图,找到第一个UIViewController作为view的控制器,最后返回该控制器。
方法三:获取当前最顶层的控制器
extension UIApplication {
class func topViewController(controller: UIViewController? = UIApplication.shared.windows.filter {$0.isKeyWindow}.first?.rootViewController) -> UIViewController? {
if let navigationController = controller as? UINavigationController {
return topViewController(controller: navigationController.visibleViewController)
}
if let tabController = controller as? UITabBarController {
if let selected = tabController.selectedViewController {
return topViewController(controller: selected)
}
}
if let presented = controller?.presentedViewController {
return topViewController(controller: presented)
}
return controller
}
}
该方法是通过对UIApplication进行扩展(extension),实现了topViewController方法,递归遍历当前窗口中所有的控制器,找到最顶层的控制器,并返回该控制器。注意该方法会忽略所有的UIPopoverPresentationController。
方法四:获取当前可见的导航控制器
if let navigationController = self.window?.rootViewController?.presentedViewController as? UINavigationController {
// do something with navigation controller
}
该方法是适用于有导航控制器的场景,通过获取当前窗口的rootViewController属性,再通过presentedViewController属性获取当前正在显示的导航控制器,最后通过as?UINavigationController进行类型转换即可。
综上,我们介绍了4种方法可以获取当前窗口显示的控制器,可以根据你的具体需求进行选择使用。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:ios获取窗口当前显示的控制器 - Python技术站