簡體   English   中英

如何從AppDelegate獲取當前可見的viewController

[英]How to get the current visible viewController from AppDelegate

所以,我正在使用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 我如何實現這一目標?

要將UIViewController用作MyViewController

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

或者如果您只是想檢查UIViewController是否為MyViewController類型:

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

您可以使用if-let語句進行條件檢查,如下所示:

if let presented = controller?.presentedViewController as? MyViewController {
    // it is a MyViewController
}

您也可以直接檢查UIViewController是否是這種類型的類:

if controller?.presentedViewController is MyViewController {
    // it is a MyViewController
}

嘗試這個:

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

對返回值進行條件轉換以安全地檢查其類型。

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類型的值來轉發它。

您可以通過以下方式進行檢查

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM