获取 iOS Swift 中的顶级 ViewController

2023-12-24

我想实现一个单独的 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;
  }
}
}
}

Amit89 提出了一种解决方案。您必须致电.windowAppDelegate 的属性。 因此,我更改了下面链接中的 Swift 代码,以便按预期找到最顶层的 ViewController。确保该视图已位于视图层次结构中。所以这个方法不能被调用.viewDidLoad

用于查找最顶层 ViewController* 的扩展

extension UIApplication {
  class func topViewController(base: UIViewController? = (UIApplication.sharedApplication().delegate as! AppDelegate).window?.rootViewController) -> UIViewController? {
    if let nav = base as? UINavigationController {
      return topViewController(base: nav.visibleViewController)
    }
    if let tab = base as? UITabBarController {
      if let selected = tab.selectedViewController {
        return topViewController(base: selected)
      }
    }
    if let presented = base?.presentedViewController {
      return topViewController(base: presented)
    }
    return base
  }
}

此代码源自 GitHub 用户Yonat https://gist.github.com/yonat in a comment https://gist.github.com/snikch/3661188到目标 C 的等价物。我只更改代码位以使其在没有.keyWindow财产

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

获取 iOS Swift 中的顶级 ViewController 的相关文章

随机推荐