48

Если я нажимаю контроллеры просмотра и/или присутствующие контроллеры модального вида на UINavigationController, как я могу узнать, что является самым большим из UIViewController? Или в моем случае, я хочу знать, является ли какой-то UITableViewController вершиной самой или нет.Получение верхней части UIViewController

Я попытался с помощью:

self.navigationController.topViewController == self 

... но это не работает. Я предполагаю, что он терпит неудачу, потому что я представляю modal view controller над ним и что topViewController только отслеживает, какие виды были сдвинуты на UINavigationController (в отличие от тех, которые были представлены модально).

+0

Связанный: [Как сказать, если вид UIViewController является видимым] (http://stackoverflow.com/questions/2777438/how-to-tell-if-uiviewcontrollers-view-is-visible) – Senseful

ответ

86

visibleViewController Вы хотите:

видимый в данный момент вид может принадлежать либо к контроллеру представления в верхней части навигационного пакета или к контроллеру представления, который был представлен модально.

+0

Могли бы вы пожалуйста, проверьте это: я хочу знать, как использовать visibleViewController для сравнения с представлением, которое я ищу. http://stackoverflow.com/questions/7498880/how-to-determine-which-view-loads-on-returning-to-foreground-from-the-background – Namratha

+2

Обратите внимание, что это только для 'UINavigationController'; если у вас нет одного из них, вам нужно будет использовать другие средства. –

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

}