我有一个应用程序,它是一个单一的视图应用程序。我有一个导航控制器,它连接到根视图控制器的所有子控制器。
在每个子控制器中,我都有一个注销按钮。我想知道我是否可以使用一个可以调用的功能,这将解除沿途打开的所有控制器,无论当用户按下注销时哪个控制器当前打开?
我的基本开始:
func tryLogout(){
self.dismissViewControllerAnimated(true, completion: nil)
let navigationController = UINavigationController(rootViewController: UIStoryboard(name: "Main", bundle: nil).instantiateViewControllerWithIdentifier("LoginViewController") )
self.presentViewController(navigationController, animated: true, completion: nil)
}
我正在寻找执行此任务的最有效内存的方法。我将我的注销函数放在一个单独的utils文件中,但是我不能使用self。而且我仍然知道要动态解除哪些控制器的问题。
更新 已建议弹出到根视图控制器。所以我的尝试是这样的:
func tryLogout(ViewController : UIViewController){
print("do something")
dispatch_async(dispatch_get_main_queue(), {
ViewController.navigationController?.popToRootViewControllerAnimated(true)
return
})
}
这是实现我追求目标的最佳途径吗?
答案 0 :(得分:126)
您可以致电:
self.view.window!.rootViewController?.dismissViewControllerAnimated(false, completion: nil)
应解除根视图控制器上方的所有视图控制器。
答案 1 :(得分:21)
更新了Swift 3.2和swift 4的答案
self.view.window!.rootViewController?.dismiss(animated: true, completion: nil)
当你使用navigationController
时self.navigationController?.popToRootViewController(animated: true)
答案 2 :(得分:15)
Swift 4:
要解除任何不需要的残留Modal ViewControllers ,我使用了它,并且在没有保留任何导航堆栈引用的情况下运行良好。
UIApplication.shared.keyWindow?.rootViewController?.dismiss(animated: false, completion: nil)
self.view.window!
因为它的模态屏幕丢失了对窗口的引用而导致我的情况崩溃。
答案 3 :(得分:8)
Swift3
navigationController?.popToRootViewControllerAnimated(true)
答案 4 :(得分:5)
看一下unwind segues是如何工作的。它非常简单,并且允许您解除/弹出到层次结构中的某个视图控制器,即使它由复杂的导航(嵌套推送或呈现的视图控制器)组成,没有太多代码。
这是一个非常好的答案(通过smilebot),展示如何使用展开segue来解决您的问题 https://stackoverflow.com/a/27463286/503527
答案 5 :(得分:3)
关闭所有模式视图。
雨燕5
view.window?.rootViewController?.dismiss(animated: true, completion: nil)
答案 6 :(得分:0)
适用于Swift 3.0 +
self.view.window!.rootViewController?.dismiss(animated: true, completion: nil)
答案 7 :(得分:0)
如果您有自定义的UITabbarController,请尝试通过以下方法关闭UITabbarController中的top viewController:
class MainTabBarController: UITabBarController {
func aFuncLikeLogout() {
self.presentedViewController?.dismiss(animated: false, completion: nil)
//......
}
}
答案 8 :(得分:-1)
迅速 用来直接跳到您的ROOT Navigation控制器上。
self.navigationController?.popToRootViewController(animated: true)