Получение самого верхнего UIViewController - PullRequest
55 голосов
/ 01 ноября 2010

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

Я пытался использовать:

self.navigationController.topViewController == self

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

Ответы [ 3 ]

93 голосов
/ 01 ноября 2010

Требуется visibleViewController:

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

21 голосов
/ 01 ноября 2010
NSArray *viewContrlls=[[self navigationController] viewControllers];

[viewContrlls lastObject];
0 голосов
/ 13 декабря 2017

Я знаю, что вопрос старый, но он все еще популярен - поэтому я хотел бы опубликовать свое лучшее решение, которое обрабатывает различные подклассы UIViewController's.В то же время вы можете расширить функциональность этого метода с помощью пользовательских контроллеров «collection», таких как боковое меню.

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

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...