Obtenir le meilleur UIViewController

Si je pousse les contrôleurs de vue et / ou présente des contrôleurs de vue modale sur un UINavigationController , comment puis-je savoir quel est le plus grand UIViewController ? Ou dans mon cas, je veux savoir si un certain UITableViewController est le meilleur ou non.

J’ai essayé d’utiliser:

 self.navigationController.topViewController == self 

… mais ça ne marche pas. Je suppose que cela échoue parce que je présente les contrôleurs de vue modale par-dessus et que topViewController ne garde qu’une trace des vues qui ont été UINavigationController sur UINavigationController (par opposition à celles présentées de façon modale).

Vous voulez visibleViewController :

La vue actuellement visible peut appartenir soit au contrôleur de vue en haut de la stack de navigation, soit à un contrôleur de vue présenté de manière modale.

 NSArray *viewContrlls=[[self navigationController] viewControllers]; [viewContrlls lastObject]; 

Je sais que la question est ancienne, mais elle est toujours populaire – c’est pourquoi je voudrais publier ma meilleure solution pour gérer différentes UIViewController's classes UIViewController's . Dans le même temps, vous pouvez étendre les fonctionnalités de cette méthode par vos contrôleurs de “collection” personnalisés, tels que les menus latéraux.

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