web-dev-qa-db-fra.com

Obtenir le meilleur de UIViewController

Si j'appuie des contrôleurs de vue et/ou des contrôleurs de vue modaux sur une UINavigationController, comment puis-je savoir quelle est la valeur la plus élevée UIViewController? Ou dans mon cas, je veux savoir si un certain UITableViewController est le plus élevé ou non.

J'ai essayé d'utiliser:

self.navigationController.topViewController == self

... mais ça ne marche pas. J'imagine que c'est un échec parce que je présente en plus des contrôleurs de vue modale et que la variable topViewController ne garde que le suivi des vues qui ont été placées sur la variable UINavigationController (par opposition à celles présentées de manière modale).

53
Senseful

Vous voulez visibleViewController:

La vue actuellement visible peut appartenir au contrôleur de vue situé en haut de la pile de navigation ou à un contrôleur de vue présenté sous forme modale.

92
Adam Ernst
NSArray *viewContrlls=[[self navigationController] viewControllers];

[viewContrlls lastObject];
20
Swastik

Je sais que la question est ancienne, mais elle reste populaire - c'est pourquoi j'aimerais publier ma meilleure solution, qui gère différentes sous-classes UIViewController's. Dans le même temps, vous pouvez étendre les fonctionnalités de cette méthode avec vos contrôleurs de "collection" personnalisés, tels que le menu latéral.

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
Timur Bernikovich