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