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

use*_*025 48 uiviewcontroller dismiss ios swift

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

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

我的基本开始:

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)
}
Run Code Online (Sandbox Code Playgroud)

我正在寻找执行此任务的最有效的内存方式.我将我的注销函数放在一个单独的utils文件中,但是我不能使用self.而且我仍然知道要动态解除哪些控制器的问题.

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

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

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

Lia*_*iam 148

你可以打电话:

self.view.window!.rootViewController?.dismissViewControllerAnimated(false, completion: nil)
Run Code Online (Sandbox Code Playgroud)

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

  • Swift 3.0语法是`self.view.window!.rootViewController?.dismiss(animated:false,completion:nil)` (3认同)

Nai*_*hta 24

斯威夫特4:

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

UIApplication.shared.keyWindow?.rootViewController?.dismiss(animated: false, completion: nil)
Run Code Online (Sandbox Code Playgroud)

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


Bij*_*wat 23

更新了Swift 3.2和swift 4的答案

self.view.window!.rootViewController?.dismiss(animated: true, completion: nil)
Run Code Online (Sandbox Code Playgroud)

当你使用navigationController时

self.navigationController?.popToRootViewController(animated: true)
Run Code Online (Sandbox Code Playgroud)


mar*_*cks 8

Swift3

navigationController?.popToRootViewControllerAnimated(true)
Run Code Online (Sandbox Code Playgroud)

  • 一个好的答案不只是发布一行代码,它解释**为什么它是一个答案. (7认同)
  • 这是一个很好的答案,不需要进一步解释。 (2认同)

hec*_*ill 7

关闭所有模态视图。

雨燕5


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

Run Code Online (Sandbox Code Playgroud)

  • 有点无耻地将接受的答案复制粘贴为新答案 (4认同)

Nit*_*bur 6

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

这是一个非常好的答案(通过smilebot),显示如何使用展开segue来解决您的问题 /sf/answers/1922430051/