Cómo get el viewController visible actual desde AppDelegate

Entonces, estoy usando el método a continuación de la extensión UIApplication para get el controller de vista superior:

  class func topViewController(controller: UIViewController? = UIApplication.shanetworking.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 } 

Pero el problema es: siempre devuelve UIViewController . Pero necesito verificar si es MyViewController por ejemplo. ¿Cómo logro eso?

Haga el casting condicional en el valor de retorno para verificar de forma segura su tipo.

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

Toda la implementación de su function es defectuosa, si realmente funciona, llevaría a una recursión infinita. Una vez que descubra el tipo de controller de vista superior actual en las instrucciones if, volverá a llamar a la misma function con el controller raíz actual como valor de input. Su function solo existe, si llega a una llamada desde un controller de vista, cuya class no es ninguna de las especificadas en sus enlaces opcionales.

Además, su implementación completa no hace nada en este momento. Usted descubre el tipo de controller de vista raíz, pero que lo actualiza al devolver un valor del tipo UIViewController .

Puede hacer una comprobación condicional con una instrucción if-let como esta:

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

También puede comprobar directamente si UIViewController es ese tipo de class como esta:

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

Para usar UIViewController como MyViewController :

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

o si solo quiere comprobar que UIViewController es del tipo MyViewController :

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

Prueba esto:

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

Puede comprobarlo de las siguientes maneras.

 class func topViewController(controller: UIViewController? = UIApplication.shanetworking.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 } }