如何从AppDelegate获取当前可见的ViewController

Zak*_*ria 5 ios swift

因此,我正在使用UIApplication扩展中的以下方法来获取顶视图控制器:

    class func topViewController(controller: UIViewController? = UIApplication.shared.keyWindow?.rootViewController) -> UIViewController? {
    if let navigationController = controller as? UINavigationController {
        return topViewController(controller: navigationController.visibleViewController)
    }
    if let tabController = controller as? UITabBarController {
        if let selected = tabController.selectedViewController {
            return topViewController(controller: selected)
        }
    }
    if let presented = controller?.presentedViewController {
        return topViewController(controller: presented)
    }
    return controller
}
Run Code Online (Sandbox Code Playgroud)

但是问题是:它总是返回UIViewController。但是我需要检查是否MyViewController为例。我该如何实现?

Dáv*_*tor 5

对返回值进行条件转换以安全检查其类型。

if let currentVC = UIApplication.topViewController() as? MyViewController {
   //the type of currentVC is MyViewController inside the if statement, use it as you want to
}
Run Code Online (Sandbox Code Playgroud)

你的整个函数实现是有缺陷的,如果它真的有效,它会导致无限递归。一旦您在 if 语句中找到当前顶视图控制器的类型,您将再次使用当前根控制器作为其输入值调用相同的函数。您的函数只存在,如果它到达来自视图控制器的调用,其类不是您的可选绑定中指定的类。

此外,您的整个实现目前没有做任何事情。您可以找到根视图控制器的类型,但通过返回 type 值来向上转换它UIViewController

  • @DávidPásztor 我无法在 Swift 4 中使用 `topViewController`。 (2认同)