2017-06-21 16 views
1

ユーザーが私たちのアプリからログアウトする方法を変更しようとしています。これを行うために、現在のVCの下にあるすべてのVCを却下し、別のVCをルートVCとして一番上に置きます。今私たちはこれをやっています。私は、メモリから下のVCを却下しないと信じています。現在のVCより下のVCをログアウトしてクリアする

let viewController = storyboard?.instantiateViewController(withIdentifier: "SignIn") 
if let unwrappedViewController = viewController { 
    self.present(unwrappedViewController, animated: true, completion: {}) 
} 

私が一番上に置きたいVCは、ナビゲーションコントローラまたはタブバーコントローラに埋め込まれていないという問題があります。以前にログインしていなくて初めてユーザーがアプリを開いていたかのように、VCを却下して新しいVCをメインVCとして設定するにはどうすればよいですか?私たちはまた、そのイベントのアニメーションが正常であれば、アニメーション化されたトランジションを望んでいます(モーダルアニメーションは問題ありません)。私はそれを行う上でさまざまな方法を読んできましたが、どちらの方法がベストプラクティスであるかを知りたいので、すべてのVCを一切​​却下し、Navコントローラにない新しいVCを上に配置する必要があります。

答えて

0

アプリのUIWindowにアクセスできる場合は、rootViewControllerプロパティをサインインビューコントローラに設定して、現在のすべてのビューコントローラを削除し、代わりにサインインビューコントローラを追加することができます。ここに例があります:

guard let appDelegate = UIApplication.shared.delegate as? AppDelegate else { return } 

// Should remove all subsequent view controllers from memory. 
appDelegate.window?.rootViewController.dismiss(animated: true, completion: nil) 

// Set the root view controller to a new instance of the sign in view controller. 
appDelegate.window?.rootViewController = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "SignIn") 
+0

私たちのルートビューコントローラはNavコントローラではないため、これらのステートメントは使用できません。私たちのルートビューコントローラはスタンドアロンのVCであり、ユーザが有効なユーザトークンを持っていることを確認するためにバックエンドで認証されているため、本質的にローディング画面です。基本的には、上記の2行目のコードでは失敗しています。 –

+0

ルートビューコントローラは、次の画面を表示していますか?もしそうなら 'appDelegate.window?.rootViewController.dismiss(アニメーション:true、完了:なし)' – paulvs

+0

はこれを行う良い方法ですか? 'guardをappDelegate = UIApplication.shared.delegateとしましょう? AppDelegate else {print( "エラー1"); (signInVC、animated:true、completion:{appDelegate.window ?.)}。}}}}}}}}}}}}}}}}}}}}}}}}}}}}}である。 rootViewController = signInVC}) ' –

関連する問題