Получите лучший ViewController в iOS Swift
Я хочу реализовать отдельный класс ErrorHandler, который отображает сообщения об ошибках при определенных событиях. Поведение этого класса следует вызывать из других классов. Когда происходит ошибка, она будет иметьUIAlertView
в качестве вывода. Отображение этого AlertView ВСЕГДА должно быть сверху. Таким образом, независимо от того, откуда выдается ошибка, самый верхний viewController должен отображать AlertMessage (например, когда происходит сбой асинхронного фонового процесса, я хочу сообщение об ошибке, независимо от того, какой View отображается на переднем плане).
Я нашел несколько суть, которые, кажется, решить мою проблему (см. Код ниже). Но зоветUIApplication.sharedApplication().keyWindow?.visibleViewController()
действительно возвращает ноль-значение.
Расширение от сущности
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;
}
}
}
}