如果我在UINavigationController
推送视图控制器和/或提供模态视图控制器,我怎样才能找出最顶层的UIViewController
?或者就我而言,我想知道某个UITableViewController
是否是最重要的。
我尝试使用:
self.navigationController.topViewController == self
......但这不起作用。我猜测它失败了,因为我在它上面呈现模态视图控制器,而topViewController
只跟踪UINavigationController
上推送的视图(而不是那些被呈现的视图)模态)。
答案 0 :(得分:93)
您想要visibleViewController
:
当前可见的视图既可以属于导航堆栈顶部的视图控制器,也可以属于模态显示的视图控制器。
答案 1 :(得分:21)
NSArray *viewContrlls=[[self navigationController] viewControllers];
[viewContrlls lastObject];
答案 2 :(得分:0)
我知道问题已经过时了,但它仍然很受欢迎 - 这就是为什么我想发布处理不同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
}
}
}