olen Sie sich den Top ViewController in iOS Swi

Ich möchte eine separate ErrorHandler-Klasse implementieren, die bei bestimmten Ereignissen Fehlermeldungen anzeigt. Das Verhalten dieser Klasse sollte von verschiedenen anderen Klassen aufgerufen werden. Wenn ein Fehler auftritt, wird ein @ angezeigUIAlertView als Ausgabe. Die Anzeige dieses AlertView sollte IMMER oben sein. Unabhängig davon, woher der Fehler kommt, sollte der oberste viewController die AlertMessage anzeigen (z. B. wenn ein asynchroner Hintergrundprozess fehlschlägt, möchte ich eine Fehlermeldung, unabhängig davon, welche Ansicht im Vordergrund angezeigt wird).

Ich habe mehrere Gründe gefunden, die mein Problem zu lösen scheinen (siehe Code unten). Aber anrufenUIApplication.sharedApplication().keyWindow?.visibleViewController() gibt keinen Wert zurück.

Erweiterung von gist

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;
  }
}
}
}

Antworten auf die Frage(4)

Ihre Antwort auf die Frage