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

12

所以,我正在使用下面的方法从UIApplication扩展中获取顶部视图控制器:

Translated version:

因此,我正在使用下面的方法从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
}

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

5个回答

5

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

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

您的整个函数实现有缺陷,如果它实际起作用,那么会导致无限递归。在if语句中找到当前顶部视图控制器的类型后,您再次使用当前根控制器作为其输入值调用相同的函数。只有当它从一个视图控制器的调用达到时,它才存在,该视图控制器的类不是您可选绑定中指定的任何一个。

此外,您的整个实现目前没有做任何事情。您找到根视图控制器的类型,但然后通过返回UIViewController类型的值进行向上转型。

你的问题似乎并没有反映出你实际的问题。请看一下我的更新答案。你的实现完全有误。你到底想做什么?你是想返回具有其确切类型的 rootViewController,而不是类型为 UIViewController 吗? - Dávid Pásztor
谢谢您的见解,我会考虑更新topViewController方法。 - Zakaria
2
@DávidPásztor 我无法在Swift 4中使用topViewController - Castor
@SoftDev,你是否像问题描述中那样声明了它? - Dávid Pásztor
1
太棒了,这对我非常有帮助。 - steveSarsawa

2
你可以使用像这样的if-let语句进行条件检查:
if let presented = controller?.presentedViewController as? MyViewController {
    // it is a MyViewController
}

您可以直接检查 UIViewController 是否为该类,例如:
if controller?.presentedViewController is MyViewController {
    // it is a MyViewController
}

1

试试这个:

if let presented = controller?.presentedViewController as? MyViewController {
    ...

1
您可以通过以下方式进行检查。
class func topViewController(controller: UIViewController? = UIApplication.shared.keyWindow?.rootViewController) -> UIViewController? {
        if let navigationController = controller as? UINavigationController {
            return topViewController(controller: navigationController.visibleViewController)
        }
        else if let tabController = controller as? UITabBarController {
            if let selected = tabController.selectedViewController {
                return topViewController(controller: selected)
            }
        }
        else if let presented = controller?.presentedViewController {
            return topViewController(controller: presented)
        }
        return controller
}


        // Answer 
        if let topVC = AppDelegate.topViewController() as? MyViewController {
            // Here your topVC is MyViewController
        }


        // or 
        if let topVC = AppDelegate.topViewController() {

            if topVC is MyViewController {
                // Here your topVC is MyViewController
            }
        }

1

使用UIViewController作为MyViewController

if let myViewController = UIApplication.topViewController() as? MyViewController { ... }

或者,如果您只想检查 UIViewController 是否为 MyViewController 类型:

if UIApplication.topViewController() is MyViewController { ... }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接