单functionclosures所有打开的视图控制器

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

在每个儿童控制器中,我有一个注销button。 我想知道是否我可以调用一个函数来closures所有沿途打开的控制器,无论用户按下注销时哪个控制器当前处于打开状态?

我的基本开始:

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

我正在寻找执行此任务的最有效的内存方式。 我会把我的注销function放在一个单独的utils文件中,但是我不能使用self。 而且我仍然有知道哪些控制器dynamic解雇的问题。

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

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

这是实现我所追求的最好方式吗?

你可以打电话给:

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

应该closures根视图控制器上的所有视图控制器。

Swift3

 navigationController?.popToRootViewControllerAnimated(true) 

更新了Swift 3.2的答案

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

看看如何放松的工作。 它的超级简单,即使它由一个复杂的导航(嵌套的推送和/或呈现的视图控制器),而不需要太多的代码,你可以解散/popup到特定的视图控制器。

这是一个非常好的答案(由smilebot),展示了如何使用unwind segues来解决你的问题https://stackoverflow.com/a/27463286/503527

适用于Swift 3.0 +

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