这是将用户弹回到UINavigationController中的根目录的函数:
func popToRoot() {
navigationController?.popToRootViewController(animated: true)
}
但是,我需要从标签栏调用此功能,这显然是一个完全不同的类和文件,甚至不在导航堆栈中。
func moveToTab3(sender: UIButton!) {
if CurrentContentController != containerStack[3] {
moveToTab(3, animated: false)
} else {
// since you are already in this tab, popToRoot function goes here, but how?
}
}
问题是.navigationController?是非常特殊的,它似乎必须从它所驻留的对象内调用。这是怎么做到的?
答案 0 :(得分:0)
我不确定我是否正确,但是为了能够从当前控制器导航到根目录,您可以使用以下方法检测应用程序中的顶级控制器:
extension UIApplication {
class func topViewController(controller: UIViewController? = UIApplication.shared.keyWindow?.rootViewController) -> UIViewController? {
if let navigationController = controller as? UINavigationController {
return topViewController(controller: navigationController.visibleViewController)
}
if let tabController = controller as? UITabBarController {
if let selected = tabController.selectedViewController {
return topViewController(controller: selected)
}
}
if let presented = controller?.presentedViewController {
return topViewController(controller: presented)
}
return controller
}
}
然后您可以访问该顶级控制器并调用popToRoot:
if let topController = UIApplication.topViewController() {
// navigate to the root
topController.navigationController?.popToRootViewController(animated: true)
}
它应该工作。如果您需要更多信息,请告诉我们