objective-c - bar - root view controller navigation controller
Obtener el mejor UIViewController (3)
Desea visibleViewController
:
La vista actualmente visible puede pertenecer al controlador de vista en la parte superior de la pila de navegación o a un controlador de vista que se presentó de forma modal.
Si UINavigationController
controladores de vista y / o presento controladores de vista modal en un UINavigationController
, ¿cómo puedo averiguar cuál es el mejor UIViewController
? O en mi caso, quiero saber si cierto UITableViewController
es el más alto o no.
Intenté usar:
self.navigationController.topViewController == self
... pero esto no funciona. Supongo que está fallando porque estoy presentando controladores de vista modales encima y que el control de vista superior solo realiza un seguimiento de las vistas que se presionaron en el UINavigationController
(a diferencia de las que se presentaron de forma modal).
Sé que la pregunta es antigua, pero sigue siendo popular, por eso me gustaría publicar mi mejor solución que maneja las diferentes subclases UIViewController''s
. Al mismo tiempo, puede ampliar la funcionalidad de este método mediante sus controladores de "recopilación" personalizados, como el menú lateral.
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
}
}
}
NSArray *viewContrlls=[[self navigationController] viewControllers];
[viewContrlls lastObject];