1. ホーム
  2. objective-c

[解決済み] AppDelegateからストーリーボード上の異なる場所で条件付きで開始する。

2022-10-26 13:12:51

質問

私は、ログインとメインビューコントローラが動作するストーリーボードを設定し、後者はログインが成功したときにユーザがナビゲートされるビューコントローラになります。 私の目的は、認証(キーチェーンに保存)が成功した場合、すぐにメインビューコントローラを表示し、認証が失敗した場合はログインビューコントローラを表示することです。 基本的に、私はこれをAppDelegateで行いたいと考えています。

// url request & response work fine, assume success is a BOOL here
// that indicates whether login was successful or not

if (success) {
          // 'push' main view controller
} else {
          // 'push' login view controller
}

performSegueWithIdentifier:というメソッドは知っていますが、このメソッドはUIViewControllerのインスタンスメソッドなので、AppDelegate内から呼び出すことができません。 既存のストーリーボードを使用してこれを行うにはどうすればよいですか?

EDITです。

Storyboardの初期ビューコントローラーは、今は何も接続されていないナビゲーションコントローラーになっています。MainIdentifierがUITabBarControllerなので、setRootViewController:の区別を使いました。そうすると、私の行はこんな感じになります。

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{        
    BOOL isLoggedIn = ...;    // got from server response

    NSString *segueId = isLoggedIn ? @"MainIdentifier" : @"LoginIdentifier";
    UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Storyboard" bundle:nil];
    UIViewController *initViewController = [storyboard instantiateViewControllerWithIdentifier:segueId];

    if (isLoggedIn) {
        [self.window setRootViewController:initViewController];
    } else {
        [(UINavigationController *)self.window.rootViewController pushViewController:initViewController animated:NO];
    }

    return YES;
}

提案/改善を歓迎します。

どのように解決するのですか?

ストーリーボードは、メインストーリーボードとして設定されていると思います。 UIMainStoryboardFile として設定されていると仮定します。) この場合、UIKitはストーリーボードを読み込み、その初期ビューコントローラをウィンドウのルートビューコントローラとして設定した後、次のように送信します。 application:didFinishLaunchingWithOptions: をAppDelegateに送信します。

また、ストーリーボードにある最初のビューコントローラはナビゲーションコントローラであり、その上にメインビューコントローラまたはログインビューコントローラをプッシュするものとします。

ウィンドウにルートビューコントローラを求め、その上に performSegueWithIdentifier:sender: メッセージを送ることができます。

NSString *segueId = success ? @"pushMain" : @"pushLogin";
[self.window.rootViewController performSegueWithIdentifier:segueId sender:self];