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

时间:2015-11-04 11:38:44

标签: ios swift uiviewcontroller dismiss

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

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

我的基本开始:

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

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

9 个答案:

答案 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)