单个函数来关闭所有打开的视图控制器

问题描述 投票:36回答:7

我有一个应用程序,它是一个单一的视图应用程序我有一个导航控制器链接到根视图控制器中的所有子控制器。

在每个子控制器中,我都有一个注销按钮。我想知道我是否可以使用一个可以调用的功能,这将解除所有已经打开的控制器,无论当用户按下注销时哪个控制器当前打开?

我的基本开始:

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。我仍然知道要动态解除哪些控制器的问题。

已建议更新Pop到根视图控制器。所以我的尝试是这样的:

func tryLogout(ViewController : UIViewController){
     print("do something")
     dispatch_async(dispatch_get_main_queue(), {
         ViewController.navigationController?.popToRootViewControllerAnimated(true)
         return
     })
 }

这是实现我追求目标的最佳途径吗?

ios swift uiviewcontroller dismiss
7个回答
130
投票

你可以打电话:

self.view.window!.rootViewController?.dismissViewControllerAnimated(false, completion: nil)

应解除根视图控制器上方的所有视图控制器。


21
投票

更新了Swift 3.2和swift 4的答案

self.view.window!.rootViewController?.dismiss(animated: true, completion: nil)

当你使用navigationController时

self.navigationController?.popToRootViewController(animated: true)

17
投票

斯威夫特4:

为了消除任何不需要的残留Modal ViewControllers,我使用了它,并且在没有保留任何导航堆栈引用的情况下运行良好。

UIApplication.shared.keyWindow?.rootViewController?.dismiss(animated: false, completion: nil)

self.view.window!为我的案子崩溃可能是因为它的模态屏幕并且丢失了对窗口的引用。


8
投票

Swift3

navigationController?.popToRootViewControllerAnimated(true)

6
投票

看看seglining如何解开工作。它非常简单,并且允许您解除/弹出到层次结构中的某个视图控制器,即使它由复杂的导航(嵌套推送或呈现的视图控制器)组成,没有太多代码。

这是一个非常好的答案(通过smilebot),显示如何使用展开segues来解决您的问题https://stackoverflow.com/a/27463286/503527


0
投票

适用于Swift 3.0 +

self.view.window!.rootViewController?.dismiss(animated: true, completion: nil)

-1
投票

Swift用于直接跳转到ROOT导航控制器。

self.navigationController?.popToRootViewController(animated: true)

© www.soinside.com 2019 - 2024. All rights reserved.