获取最顶层的UIViewController

60

如果我在一个 UINavigationController 上推送视图控制器和/或呈现模态视图控制器,那么如何找出顶部的 UIViewController ?或者在我的情况下,我想知道某个 UITableViewController 是否是最顶部的。

我尝试使用:

self.navigationController.topViewController == self

......但是它不起作用。我猜想这是因为我在其上方呈现了模态视图控制器,而topViewController仅跟踪被推送到UINavigationController的视图(而不是以模态方式呈现的那些视图)。


3个回答

102
你需要 visibleViewController:

当前可见视图可能属于导航堆栈顶部的视图控制器或以模态方式呈现的视图控制器。


请帮忙查一下:我想知道如何使用visibleViewController与我要查找的视图进行比较。http://stackoverflow.com/questions/7498880/how-to-determine-which-view-loads-on-returning-to-foreground-from-the-background - Namratha
3
请注意,这仅适用于 UINavigationController;如果您没有其中之一,您将需要使用其他方法。 - Ky -

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

[viewContrlls lastObject];

0

我知道这个问题很老,但它仍然很受欢迎 - 这就是为什么我想发布我的最佳解决方案,它处理不同的UIViewController子类。同时,您可以通过自定义“集合”控制器(例如侧边菜单)扩展此方法的功能。

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

}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接