Controlador de vista actual de AppDelegate?

¿Hay alguna manera de obtener el controlador de vista actual de AppDelegate? Sé que hay rootViewController, pero eso no es lo que estoy buscando.

Si tiene UINavigationController en appDelegate, use su propiedad topViewController o visibleViewController

Si el controlador de vista raíz de su aplicación es un UINavigationController , puede hacer esto:

 ((UINavigationController*)appDelegate.window.rootViewController).visibleViewController; 

Del mismo modo, si se trata de un UITabBarController puede hacer esto:

 ((UITabBarController*)appDelegate.window.rootViewController).selectedViewController; 

Por supuesto, el casting explícito como este está sucio. Sería mejor capturar la referencia usted mismo usando tipos fuertes.

Esto podría ayudar

 - (UIViewController *)topViewController{ return [self topViewController:[UIApplication sharedApplication].keyWindow.rootViewController]; } - (UIViewController *)topViewController:(UIViewController *)rootViewController { if (rootViewController.presentedViewController == nil) { return rootViewController; } if ([rootViewController.presentedViewController isKindOfClass:[UINavigationController class]]) { UINavigationController *navigationController = (UINavigationController *)rootViewController.presentedViewController; UIViewController *lastViewController = [[navigationController viewControllers] lastObject]; return [self topViewController:lastViewController]; } UIViewController *presentedViewController = (UIViewController *)rootViewController.presentedViewController; return [self topViewController:presentedViewController]; } 

Versión Swift:

 extension UIApplication { class func topViewController(base: UIViewController? = UIApplication.shared.keyWindow?.rootViewController) -> UIViewController? { if let nav = base as? UINavigationController { return topViewController(base: nav.visibleViewController) } if let tab = base as? UITabBarController { if let selected = tab.selectedViewController { return topViewController(base: selected) } } if let presented = base?.presentedViewController { return topViewController(base: presented) } return base } } 

Tomado de: https://gist.github.com/snikch/3661188

Haga una extensión:

 extension UIApplication { class func topViewController(base: UIViewController? = UIApplication.sharedApplication().keyWindow?.rootViewController) -> UIViewController? { if let nav = base as? UINavigationController { return topViewController(nav.visibleViewController) } if let tab = base as? UITabBarController { let moreNavigationController = tab.moreNavigationController if let top = moreNavigationController.topViewController where top.view.window != nil { return topViewController(top) } else if let selected = tab.selectedViewController { return topViewController(selected) } } if let presented = base?.presentedViewController { return topViewController(presented) } return base } } 

Uso:

 if let rootViewController = UIApplication.topViewController() { //do sth with root view controller } 

Obtener el objeto applegategate:

 MyAppDelegate *tmpDelegate = (MyAppDelegate *)[[UIApplication sharedApplication] delegate]; 

Como berilio sugirió que puede utilizar las propiedades del UINavigationController para acceder a su controlador de vista actual.

Entonces el código se vería así:

 id myCurrentController = tmpDelegate.myNavigationController.topViewController; 

o:

 NSArray *myCurrentViewControllers = tmpDelegate.myNavigationController.viewControllers; 

Puede obtener el controlador de vista actual de rootViewController buscando su ViewController presentado, así:

 UIViewController *parentViewController = [[[UIApplication sharedApplication] delegate] window].rootViewController; while (parentViewController.presentedViewController != nil){ parentViewController = parentViewController.presentedViewController; } UIViewController *currentViewController = parentViewController; 

Funciona conmigo Espero eso ayude 🙂

Para cualquiera que no use un UINavigationController pero su controlador de vista predeterminado es un UIViewController puede verificar qué controlador de vista está activo (o presentado) con lo siguiente en AppDelegate :

 func application(application: UIApplication, supportedInterfaceOrientationsForWindow window: UIWindow?) -> Int { if let rootViewController = self.window!.rootViewController { if let presentedViewController = rootViewController.presentedViewController { return presentedViewController.supportedInterfaceOrientations() } } // Else current view controller is DefaultViewController return Int(UIInterfaceOrientationMask.Portrait.rawValue) } 

Como puede ver, estoy comprobando el controlador de vista actual para admitir diferentes orientaciones de interfaz para controladores de vista específicos. Para cualquier otra persona interesada en utilizar este método para brindar soporte específico, se debe colocar lo siguiente en cada controlador de vista que necesite una orientación específica.

 override func supportedInterfaceOrientations() -> Int { return Int(UIInterfaceOrientationMask.All.rawValue) } 

Nota: Este código fue escrito con Swift 1.2

Solución Swift:

  self.window.rootViewController.presentedViewController. 

Eso debería darte lo que necesitas.

A menudo necesito recuperar el controlador de vista que se muestra actualmente. Podría significar el controlador de vista en la parte superior de la stack del UINavigationController actual, el controlador de vista presentado actualmente, etc. Por lo tanto, escribí esta función que se da cuenta la mayoría del tiempo, y que puede usar dentro de una extensión UIViewController.

Código en Swift 3 :

 func currentViewController( _ viewController: UIViewController? = UIApplication.shared.keyWindow?.rootViewController) -> UIViewController? { guard let viewController = viewController else { return nil } if let viewController = viewController as? UINavigationController { if let viewController = viewController.visibleViewController { return currentViewController(viewController) } else { return currentViewController( viewController.topViewController) } } else if let viewController = viewController as? UITabBarController { if let viewControllers = viewController.viewControllers, viewControllers.count > 5, viewController.selectedIndex >= 4 { return currentViewController( viewController.moreNavigationController) } else { return currentViewController( viewController.selectedViewController) } } else if let viewController = viewController.presentedViewController { return viewController } else if viewController.childViewControllers.count > 0 { return viewController.childViewControllers[0] } else { return viewController } } 

Llámalo con: currentViewController()