【问题标题】:Getting the top most UIViewController获取最顶层的 UIViewController
【发布时间】:2011-05-03 08:00:37
【问题描述】:

如果我在UINavigationController 上推送视图控制器和/或呈现模式视图控制器,我如何找出最顶部的UIViewController 是什么?或者就我而言,我想知道某个UITableViewController 是否是最高的。

我尝试使用:

self.navigationController.topViewController == self

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

【问题讨论】:

标签: objective-c cocoa-touch uiviewcontroller uinavigationcontroller


【解决方案1】:

你想要visibleViewController:

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

【讨论】:

  • 能否请您检查一下:我想知道如何使用 visibleViewController 与我正在寻找的视图进行比较。 stackoverflow.com/questions/7498880/…
  • 请注意,这仅适用于UINavigationController;如果您没有其中之一,则需要使用其他方式。
【解决方案2】:
NSArray *viewContrlls=[[self navigationController] viewControllers];

[viewContrlls lastObject];

【讨论】:

    【解决方案3】:

    我知道这个问题很老,但它仍然很受欢迎 - 这就是为什么我想发布我最好的解决方案来处理不同的 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
        }
      }
    
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-03-27
      • 1970-01-01
      • 2011-01-03
      • 2015-04-25
      相关资源
      最近更新 更多