Obtenha o melhor ViewController no iOS Swift
Desejo implementar uma classe ErrorHandler separada, que exibe mensagens de erro em determinados eventos. O comportamento desta classe deve ser chamado de diferentes outras classes. Quando ocorrer um erro, ele terá umUIAlertView
como saída. A exibição deste AlertView SEMPRE deve estar no topo. Portanto, não importa de onde o erro seja lançado, o viewController superior deverá exibir o AlertMessage (por exemplo, quando um processo em segundo plano assíncrono falhar, desejo uma mensagem de erro, independentemente da visualização exibida em primeiro plano).
Encontrei várias dicas que parecem resolver o meu problema (veja o código abaixo). Mas chamandoUIApplication.sharedApplication().keyWindow?.visibleViewController()
retorna um valor nulo.
Extensão da essência
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;
}
}
}
}