48

Jeśli wypycham kontrolery widoku i/lub obecne kontrolery widoku modalnego na UINavigationController, w jaki sposób mogę dowiedzieć się, jaka jest największa liczba UIViewController? Lub w moim przypadku chcę wiedzieć, czy pewne UITableViewController jest najlepsze, czy nie.Uzyskiwanie najwyższego poziomu UIViewController

Próbowałem za pomocą:

self.navigationController.topViewController == self 

... ale to nie działa. Zgaduję, że to się nie udaje, ponieważ przedstawiam na nim kontrolery widoku modalnego i że tylko topViewController śledzi tylko, które widoki zostały pchnięte na UINavigationController (w przeciwieństwie do tych, które zostały zaprezentowane modalnie).

+0

pokrewne: [Jak sprawdzić, czy widok UIViewController jest widoczny] (http://stackoverflow.com/questions/2777438/how-to-tell-if-uiviewcontrollers-view-is-visible) – Senseful

Odpowiedz

86

Chcesz visibleViewController:

Aktualnie widoczne widok może należeć albo do kontrolera widoku na szczycie stosu nawigacji lub do kontrolera widoku, który został zaprezentowany modally.

+0

mogłeś proszę sprawdzić to: Chcę wiedzieć, jak używać visibleViewController do porównania z widoku, którego szukam. http://stackoverflow.com/questions/7498880/how-to-determine-which-view-loads-on-returning-to-foreground-f--the-background – Namratha

+2

Należy zauważyć, że jest to tylko dla 'UINavigationController'; jeśli nie masz jednego z nich, musisz użyć innych środków. –

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

[viewContrlls lastObject]; 
0

Wiem, że pytanie jest stary, ale nadal popularny - dlatego chciałbym pisać mojego najlepszego rozwiązania, które obsługuje różne UIViewController's podklasy. Jednocześnie możesz rozszerzyć funkcjonalność tej metody o niestandardowe kontrolery "kolekcji", takie jak menu boczne.

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

} 
Powiązane problemy