Objective c 获取最顶级的UIViewController

Objective c 获取最顶级的UIViewController,objective-c,cocoa-touch,uiviewcontroller,uinavigationcontroller,Objective C,Cocoa Touch,Uiviewcontroller,Uinavigationcontroller,如果我在UINavigationController上推送视图控制器和/或显示模式视图控制器,如何找出最顶端的UIViewController?或者在我的例子中,我想知道某个UITableViewController是否是最上面的 我尝试使用: self.navigationController.topViewController == self 。。。但这不起作用。我猜它失败了,因为我在它上面显示了模态视图控制器,topViewController只跟踪哪些视图被推送到了UINavigati

如果我在
UINavigationController
上推送视图控制器和/或显示模式视图控制器,如何找出最顶端的
UIViewController
?或者在我的例子中,我想知道某个
UITableViewController
是否是最上面的

我尝试使用:

self.navigationController.topViewController == self

。。。但这不起作用。我猜它失败了,因为我在它上面显示了模态视图控制器,
topViewController
只跟踪哪些视图被推送到了
UINavigationController
(与以模态方式显示的视图相反)。

您想要
visibleViewController

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


我知道这个问题由来已久,但它仍然很流行——这就是为什么我想发布我处理不同
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
    }
  }

}

请您检查一下:我想知道如何使用visibleViewController与我正在寻找的视图进行比较。请注意,这仅适用于
UINavigationController
;如果您没有这些方法之一,则需要使用其他方法。相关:
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
    }
  }

}