シングルビューアプリケーションであるアプリがあります。ルートビューコントローラーからすべての子コントローラーにリンクされたナビゲーションコントローラーがあります。
各子コントローラーには、ログアウトボタンがあります。ユーザーがログアウトを押したときに現在開いていたコントローラーに関係なく、途中で開いていたすべてのコントローラーを閉じる単一の関数を呼び出すことができますか?
私の基本的なスタート:
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
})
}
これが私の目標を達成するための最良の方法でしょうか?
あなたは電話することができます:
self.view.window!.rootViewController?.dismissViewControllerAnimated(false, completion: nil)
ルートView Controllerより上のすべてのView Controllerを閉じる必要があります。
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!
は、おそらくモーダル画面であり、ウィンドウへの参照を失ったために、私のケースではクラッシュしました。
Swift3
navigationController?.popToRootViewControllerAnimated(true)
セグエのアンワインドの仕組みをご覧ください。非常にシンプルで、複雑なナビゲーション(ネストされたプッシュまたはプレゼンテーションビューコントローラー)で構成されている場合でも、多くのコードなしで、階層内の特定のビューコントローラーを破棄/ポップできます。
ここに非常に良い答えがあります(smilebotによる)あなたの問題を解決するためにアンワインドセグエを使用する方法を示しています https://stackoverflow.com/a/27463286/503527
Swift 3.0 +で動作します
self.view.window!.rootViewController?.dismiss(animated: true, completion: nil)