首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >获得最高的UIViewController

获得最高的UIViewController
EN

Stack Overflow用户
提问于 2010-11-01 17:16:18
回答 2查看 41.4K关注 0票数 59

如果我推送视图控制器和/或在UINavigationController上呈现模式视图控制器,我如何找出最顶层的UIViewController是什么?或者在我的例子中,我想知道某个UITableViewController是否是最靠前的。

我尝试使用:

代码语言:javascript
复制
self.navigationController.topViewController == self

..。但这不管用。我猜它之所以失败,是因为我在它上面呈现了模态视图控制器,并且topViewController只跟踪在UINavigationController上推送了哪些视图(而不是那些以模态呈现的视图)。

EN

回答 2

Stack Overflow用户

发布于 2010-11-01 21:09:09

代码语言:javascript
复制
NSArray *viewContrlls=[[self navigationController] viewControllers];

[viewContrlls lastObject];
票数 22
EN

Stack Overflow用户

发布于 2017-12-13 23:55:23

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

代码语言:javascript
复制
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
    }
  }

}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4067692

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档