48

Si presiono los controladores de vista y/o los controladores de vista modal en un UINavigationController, ¿cómo puedo averiguar cuál es el más alto UIViewController? O en mi caso, quiero saber si un cierto UITableViewController es el más alto o no.Obtener el máximo UIViewController

He intentado utilizar:

self.navigationController.topViewController == self 

... pero esto no funciona. Supongo que está fallando porque presento controladores de vista modales y el topViewController solo hace un seguimiento de las vistas que se presionaron en el UINavigationController (a diferencia de las que se presentaron de forma modal).

+0

relacionadas: [¿Cómo saber si la opinión de UIViewController es visible] (http://stackoverflow.com/questions/2777438/how-to-tell-if-uiviewcontrollers-view-is-visible) – Senseful

Respuesta

86

¿Quieres visibleViewController:

La vista actualmente visible puede formar parte de la controlador de vista en la parte superior de la pila de navegación oa un controlador de vista que se presentó de forma modal.

+0

Podría usted Verifique esto: quiero saber cómo usar visibleViewController para compararlo con la vista que estoy buscando. http://stackoverflow.com/questions/7498880/how-to-determine-which-view-loads-on-returning-to-foreground-from-the-background – Namratha

+2

Tenga en cuenta que esto es solo para 'UINavigationController'; si no tiene uno de estos, deberá usar otros medios. –

19
NSArray *viewContrlls=[[self navigationController] viewControllers]; 

[viewContrlls lastObject]; 
0

sé que la pregunta es antigua, pero sigue siendo muy popular - es por eso que me gustaría publicar mi mejor solución que se ocupa de diferentes subclases UIViewController's. Al mismo tiempo, puede ampliar la funcionalidad de este método mediante sus controladores de "recopilación" personalizados, como el menú lateral.

extension UIWindow { 

    var visibleViewController: UIViewController? { 
    guard let rootViewController = rootViewController else { 
     return nil 
    } 
    return visibleViewController(for: rootViewController) 
    } 

    private func visibleViewController(for controller: UIViewController) -> UIViewController { 
    var nextOnStackViewController: UIViewController? = nil 
    if let presented = controller.presentedViewController { 
     nextOnStackViewController = presented 
    } else if let navigationController = controller as? UINavigationController, 
     let visible = navigationController.visibleViewController { 
     nextOnStackViewController = visible 
    } else if let tabBarController = controller as? UITabBarController, 
     let visible = (tabBarController.selectedViewController ?? 
     tabBarController.presentedViewController) { 
     nextOnStackViewController = visible 
    } 

    if let nextOnStackViewController = nextOnStackViewController { 
     return visibleViewController(for: nextOnStackViewController) 
    } else { 
     return controller 
    } 
    } 

} 
Cuestiones relacionadas