[英]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.