2

ストーリーボードを使用してアプリケーションを開発しています。このアプリケーションは、ユーザーがログインする必要があります。

ストーリーボードには、初期設定としてログイン ビューがあります。ログインに成功すると、TabViewControllerへのセグエが実行されます。

API を呼び出すたびに、サーバーが 401 (許可されていない) を返すかどうかを確認します。これが発生した場合、ブール値は false (ブール値 isLogged) に設定されます。AppDelegate はこのブール値を観察します。値が false に変更された場合、ユーザーをログイン画面に戻したい (ストーリーボードの最初のビューを思い出してください)。

ここにいくつかのコードがあります:

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context {

if ([keyPath isEqualToString:@"isLogged"]) {
    BOOL logged = [[change objectForKey:NSKeyValueChangeNewKey] boolValue];
    if (logged) {
        NSLog(@"Logged in succesfully!");
    } else {
        NSLog(@"Logout performed");

        [self.window makeKeyAndVisible];
        [self.window layoutSubviews];

    }

}

これは正常に機能しますが、再度ログインしようとすると、LoginOKセグエが実行されません。

私は次のような他の多くのオプションを試しました:

UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"MainStoryboard" bundle:nil];

UIViewController *loginController = [storyboard instantiateViewControllerWithIdentifier:@"Login"];

[source presentModalViewController:loginController animated:YES];

しかし問題は、ログアウトを実行した View Controller がわからないことです。ソースは、アプリケーションに表示されている現在のビュー コントローラーでなければなりませんね。

4

2 に答える 2

3

私はこのかなりランダムなアイデアをあなたと共有したいと思いました。

ログイン画面をビュー階層の重要なステップにしなかったが、アプリの状態にログインする必要があるとすぐに、通常のビューコントローラーからモーダルに表示した場合はどうなりますか。それがモーダルビューコントローラーの目的です。ユーザーは、いくつかの明示的な前提条件が満たされるまで、通常のフローを再開します。

このようにすることで、ナビゲーションスタック全体を最初のコントローラーに巻き戻すことを心配する必要がなくなります。認証が正常に実行されるとすぐに、ユーザーは最初からやり直すのではなく、通常のワークフローを再開できるようになるため、状態を保持することもはるかに簡単です。

ただのアイデア。

アップデート#1:

1つのオプションは、カスタム通知を使用してログインが必要な状態を実行することです。すべてのViewControllerに通知を監視させる必要があり、現在表示されているものがモーダルViewControllerの表示を実行します。

ここから借用したこのコードを使用して、ViewControllerインスタンスが表示されているかどうかを確認できます。

if (viewController.isViewLoaded && viewController.view.window) {
    // viewController is visible
}
于 2012-07-01T18:11:37.687 に答える
3

最後に、isLoggedのオブザーバーをApp Delegate からカスタムTabViewControllerに変更する問題を解決しました。viewDidLoadで、この var をサブスクライブします

メソッドobserveValueForKeyPathでは、次のことを行います。

UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"MainStoryboard" bundle:nil];

LoginViewController *loginController = [storyboard instantiateViewControllerWithIdentifier:@"Login"];


[self presentModalViewController:loginController animated:YES];
于 2012-07-01T23:15:25.367 に答える