48

如果我在UINavigationController上推視圖控制器和/或呈現模態視圖控制器,我如何才能找出最頂級的UIViewController?或者在我的情況下,我想知道某個UITableViewController是否最重要。獲取最頂級的UIViewController

我試着使用:

self.navigationController.topViewController == self 

...但是這是行不通的。我在猜測它失敗了,因爲我在其上展示了模態視圖控制器,並且topViewController只跟蹤在UINavigationController上推送哪些視圖(與那些以模態方式呈現的視圖相反)。

+0

相關:如何判斷是否UIViewController的視圖可見(http://stackoverflow.com/questions/2777438/how-to-tell-if-uiviewcontrollers-view-is-visible) – Senseful 2013-07-08 18:10:24

回答

86

你想visibleViewController

當前可見的視圖可以在導航堆棧的頂部,或者這是模式地呈現一個視圖控制器屬於要麼視圖控制器。

+0

莫非你請檢查這一點:我想知道如何使用visibleViewController與我正在查找的視圖進行比較。 http://stackoverflow.com/questions/7498880/how-to-determine-which-view-loads-on-returning-to-foreground-from-the-background – Namratha 2011-09-22 04:25:28

+2

請注意,這隻適用於'UINavigationController';如果你沒有這些,你需要使用其他方法。 – 2015-10-21 21:43:52

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

[viewContrlls lastObject]; 
0

我知道這個問題是舊的,但它仍然是流行 - 這就是爲什麼我想發佈它處理不同UIViewController's子我最好的解決方案。同時,您可以通過自定義「集合」控制器(如側面菜單)擴展此方法的功能。

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

}