Obtenga el ViewController superior en iOS Swift
Quiero implementar una clase separada de ErrorHandler, que muestra mensajes de error en ciertos eventos. El comportamiento de esta clase debe llamarse desde otras clases diferentes. Cuando ocurre un error, tendrá unUIAlertView
como salida La visualización de este AlertView SIEMPRE debe estar en la parte superior. Entonces, sin importar desde dónde se arroje el Error, la vista superior El Controlador debe mostrar el Mensaje de Alerta (por ejemplo, cuando falla un proceso de fondo asíncrono, quiero un mensaje de error, sin importar qué Vista se muestre en primer plano).
He encontrado varias claves que parecen resolver mi problema (vea el código a continuación). Pero llamandoUIApplication.sharedApplication().keyWindow?.visibleViewController()
devuelve un valor nulo.
Extensión desde la esencia
extension UIWindow {
func visibleViewController() -> UIViewController? {
if let rootViewController: UIViewController = self.rootViewController {
return UIWindow.getVisibleViewControllerFrom(rootViewController)
}
return nil
}
class func getVisibleViewControllerFrom(vc:UIViewController) -> UIViewController {
if vc.isKindOfClass(UINavigationController.self) {
let navigationController = vc as! UINavigationController
return UIWindow.getVisibleViewControllerFrom( navigationController.visibleViewController)
} else if vc.isKindOfClass(UITabBarController.self) {
let tabBarController = vc as! UITabBarController
return UIWindow.getVisibleViewControllerFrom(tabBarController.selectedViewController!)
} else {
if let presentedViewController = vc.presentedViewController {
return UIWindow.getVisibleViewControllerFrom(presentedViewController.presentedViewController!)
} else {
return vc;
}
}
}
}