ストーリーボードのログイン画面、ログアウト時のデータ消去の処理に関するベストプラクティス 質問する

ストーリーボードのログイン画面、ログアウト時のデータ消去の処理に関するベストプラクティス 質問する

ストーリーボードを使用して iOS アプリを構築しています。ルート ビュー コントローラーはタブ バー コントローラーです。ログイン/ログアウト プロセスを作成していますが、ほとんど問題なく動作していますが、いくつか問題があります。これらすべてを設定するための最適な方法を知る必要があります。

私は次のことを達成したいと考えています。

  1. アプリを初めて起動したときにログイン画面を表示します。ログインすると、タブ バー コントローラーの最初のタブに移動します。
  2. その後、ユーザーがアプリを起動するたびに、ログインしているかどうかを確認し、ルート タブ バー コントローラーの最初のタブに直接スキップします。
  3. ユーザーが手動でログアウト ボタンをクリックすると、ログイン画面が表示され、ビュー コントローラーからすべてのデータがクリアされます。

これまでに行ったことは、ルート ビュー コントローラーを Tab Bar Controller に設定し、Login ビュー コントローラーへのカスタム segue を作成することです。Tab Bar Controller クラス内で、メソッド内でログインしているかどうかを確認しviewDidAppear、segue を実行します。[self performSegueWithIdentifier:@"pushLogin" sender:self];

ログアウトアクションを実行する必要があるときに通知を設定することもできます。[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(logoutAccount) name:@"logoutAccount" object:nil];

ログアウト時に、キーチェーンから資格情報をクリアし、[self setSelectedIndex:0]segue を実行してログイン ビュー コントローラーを再度表示します。

これはすべて正常に動作しますが、疑問に思うことがあります。このロジックは AppDelegate に含めるべきでしょうか?また、2 つの問題があります。

  • アプリを初めて起動すると、セグエが実行される前にタブ バー コントローラーが短時間表示されます。コードを に移動しようとしましたviewWillAppearが、セグエはそれほど早くは機能しません。
  • ログアウトすると、すべてのデータがすべてのビュー コントローラー内に残ります。新しいアカウントにログインすると、更新するまで古いアカウント データが引き続き表示されます。ログアウト時にこれを簡単にクリアする方法が必要です。

これをやり直すつもりです。ログイン画面をルート ビュー コントローラーにするか、AppDelegate にナビゲーション コントローラーを作成してすべてを処理することを検討しましたが、現時点では最適な方法がわかりません。

ベストアンサー1

ストーリーボードは次のようになります

appDelegate.mのdidFinishLaunchingWithOptions内で

//authenticatedUser: check from NSUserDefaults User credential if its present then set your navigation flow accordingly

if (authenticatedUser) 
{
    self.window.rootViewController = [[UIStoryboard storyboardWithName:@"Main" bundle:[NSBundle mainBundle]] instantiateInitialViewController];        
}
else
{
    UIViewController* rootController = [[UIStoryboard storyboardWithName:@"Main" bundle:[NSBundle mainBundle]] instantiateViewControllerWithIdentifier:@"LoginViewController"];
    UINavigationController* navigation = [[UINavigationController alloc] initWithRootViewController:rootController];

    self.window.rootViewController = navigation;
}

SignUpViewController.mファイル内

- (IBAction)actionSignup:(id)sender
{
    AppDelegate *appDelegateTemp = [[UIApplication sharedApplication]delegate];

    appDelegateTemp.window.rootViewController = [[UIStoryboard storyboardWithName:@"Main" bundle:[NSBundle mainBundle]] instantiateInitialViewController];
}

ファイル MyTabThreeViewController.m

- (IBAction)actionLogout:(id)sender {

    // Delete User credential from NSUserDefaults and other data related to user

    AppDelegate *appDelegateTemp = [[UIApplication sharedApplication]delegate];

    UIViewController* rootController = [[UIStoryboard storyboardWithName:@"Main" bundle:[NSBundle mainBundle]] instantiateViewControllerWithIdentifier:@"LoginViewController"];

    UINavigationController* navigation = [[UINavigationController alloc] initWithRootViewController:rootController];
    appDelegateTemp.window.rootViewController = navigation;

}

Swift 4 バージョン

初期ビュー コントローラーがサインインした TabbarController であると想定して、アプリ デリゲートの didFinishLaunchingWithOptions を実行します。

if Auth.auth().currentUser == nil {
        let rootController = UIStoryboard(name: "Main", bundle: Bundle.main).instantiateViewController(withIdentifier: "WelcomeNavigation")
        self.window?.rootViewController = rootController
    }

    return true

サインアップビューコントローラーの場合:

@IBAction func actionSignup(_ sender: Any) {
let appDelegateTemp = UIApplication.shared.delegate as? AppDelegate
appDelegateTemp?.window?.rootViewController = UIStoryboard(name: "Main", bundle: Bundle.main).instantiateInitialViewController()
}

マイタブスリービューコントローラ

 //Remove user credentials
guard let appDel = UIApplication.shared.delegate as? AppDelegate else { return }
        let rootController = UIStoryboard(name: "Main", bundle: Bundle.main).instantiateViewController(withIdentifier: "WelcomeNavigation")
        appDel.window?.rootViewController = rootController

おすすめ記事