48

Se spingo i controller di visualizzazione e/o presenti i controller di visualizzazione modali su un UINavigationController, come posso scoprire qual è il massimo UIViewController? O nel mio caso, voglio sapere se un certo UITableViewController è il più alto o meno.Come ottenere il massimo da UIViewController

Ho provato ad utilizzare:

self.navigationController.topViewController == self 

... ma questo non funziona. Sto indovinando che non funziona perché sto presentando i controller di visualizzazione modali su di esso e che lo topViewController tiene traccia solo di quali viste sono state inserite sullo UINavigationController (a differenza di quelle presentate in modo modale).

+0

correlati: [Come sapere se vista di UIViewController è visibile] (http://stackoverflow.com/questions/2777438/how-to-tell-if-uiviewcontrollers-view-is-visible) – Senseful

risposta

86

Volete visibleViewController:

La vista attualmente visibile può appartenere sia al controller della vista in cima alla pila di navigazione o ad un controller della vista che è stato presentato modale.

+0

Potresti per favore controlla questo: voglio sapere come usare visibleViewController per confrontarlo con la vista che sto cercando. http://stackoverflow.com/questions/7498880/how-to-determine-which-view-loads-on-returning-to-foreground-from-the-background – Namratha

+2

Si noti che questo è solo per 'UINavigationController'; se non ne hai uno, dovrai usare altri mezzi. –

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

[viewContrlls lastObject]; 
0

So che il problema è vecchio, ma è ancora popolare - è per questo che vorrei inviare il mio migliore soluzione che gestisce diversi UIViewController's sottoclassi. Allo stesso tempo è possibile estendere la funzionalità di questo metodo dai propri controller di "raccolta" personalizzati come il menu laterale.

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

} 
Problemi correlati