代码之家  ›  专栏  ›  技术社区  ›  Senseful

获取最上面的UIViewController

  •  54
  • Senseful  · 技术社区  · 14 年前

    如果我在 UINavigationController ,我怎样才能找到最上面的 UIViewController ? 或者在我的情况下,我想知道 UITableViewController 是不是最高的。

    我试着用:

    self.navigationController.topViewController == self
    

    ... 但这不管用。我猜它失败了,因为我在上面展示了模态视图控制器,并且 topViewController 只跟踪哪些视图被推到 (与那些以模态呈现的相反)。

    3 回复  |  直到 9 年前
        1
  •  95
  •   Matt Sheppard    14 年前

    你想要的 visibleViewController :

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

        2
  •  21
  •   Luke Hardik Soni    12 年前
    NSArray *viewContrlls=[[self navigationController] viewControllers];
    
    [viewContrlls lastObject];
    
        3
  •  0
  •   Timur Bernikovich    7 年前

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