获得最顶级的UIViewController

时间:2010-11-01 09:16:18

标签: objective-c cocoa-touch uiviewcontroller uinavigationcontroller

如果我在UINavigationController推送视图控制器和/或提供模态视图控制器,我怎样才能找出最顶层的UIViewController?或者就我而言,我想知道某个UITableViewController是否是最重要的。

我尝试使用:

self.navigationController.topViewController == self

......但这不起作用。我猜测它失败了,因为我在它上面呈现模态视图控制器,而topViewController只跟踪UINavigationController上推送的视图(而不是那些被呈现的视图)模态)。

3 个答案:

答案 0 :(得分:93)

您想要visibleViewController

  

当前可见的视图既可以属于导航堆栈顶部的视图控制器,也可以属于模态显示的视图控制器。

答案 1 :(得分:21)

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

[viewContrlls lastObject];

答案 2 :(得分: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
    }
  }

}