web-dev-qa-db-ja.com

開いているすべてのView Controllerを閉じる単一の機能

シングルビューアプリケーションであるアプリがあります。ルートビューコントローラーからすべての子コントローラーにリンクされたナビゲーションコントローラーがあります。

各子コントローラーには、ログアウトボタンがあります。ユーザーがログアウトを押したときに現在開いていたコントローラーに関係なく、途中で開いていたすべてのコントローラーを閉じる単一の関数を呼び出すことができますか?

私の基本的なスタート:

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 to root View Controllerが提案されました。だから私の試みは次のようなものです:

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

これが私の目標を達成するための最良の方法でしょうか?

43
user2363025

あなたは電話することができます:

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

ルートView Controllerより上のすべてのView Controllerを閉じる必要があります。

136
Liam

Swift 3.2およびSwift 4の回答を更新しました

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

およびnavigationControllerを使用する場合

self.navigationController?.popToRootViewController(animated: true)

Swift 4:

不要な残留Modal ViewControllersを破棄に、これを使用し、ナビゲーションスタック参照を保持せずに適切に機能しました。

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

self.view.window!は、おそらくモーダル画面であり、ウィンドウへの参照を失ったために、私のケースではクラッシュしました。

20
Naishta

Swift3

navigationController?.popToRootViewControllerAnimated(true)
8
markhorrocks

セグエのアンワインドの仕組みをご覧ください。非常にシンプルで、複雑なナビゲーション(ネストされたプッシュまたはプレゼンテーションビューコントローラー)で構成されている場合でも、多くのコードなしで、階層内の特定のビューコントローラーを破棄/ポップできます。

ここに非常に良い答えがあります(smilebotによる)あなたの問題を解決するためにアンワインドセグエを使用する方法を示しています https://stackoverflow.com/a/27463286/503527

6
Nitin Alabur

Swift 3.0 +で動作します

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