2

これを使用してサイド ビュー コントローラーのセットアップを使用しています: https://github.com/edgecase/ECSlidingViewController

初期ビュー コントローラーは、'InitialViewController' の識別子を持つストーリーボードを使用して読み込まれます。

このためにviewDidLoadにロードされたら、以下を使用してユーザーがログインしているかどうかを確認します。

UIStoryboard *storyboard;

if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone) {
    storyboard = [UIStoryboard storyboardWithName:@"MainStoryboard_iPhone" bundle:nil];
} else if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) {
    storyboard = [UIStoryboard storyboardWithName:@"MainStoryboard_iPad" bundle:nil];
}

if (![PFUser currentUser]){
    self.topViewController = [storyboard instantiateViewControllerWithIdentifier:@"WelcomeVC"];
} else {
    self.topViewController = [storyboard instantiateViewControllerWithIdentifier:@"HomeVC"];
}

上記のように、ユーザーがログインしていない場合、WelcomeVC が読み込まれます。WelcomeVC は、内部に 3 つの Vc を持つナビゲーション コントローラーです。ようこそ/ログイン/サインアップ。

ユーザーがログインしたら、topViewController (上記のように) を HomeVC に変更する必要があります。可能であれば、WelcomeVC と呼ばれるナビゲーション コントローラーを閉じることができます。この topViewController を変更するにはどうすればよいですか? 私はこれを試しましたが、うまくいきません:

UIStoryboard *ストーリーボード;

if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone) {
    storyboard = [UIStoryboard storyboardWithName:@"MainStoryboard_iPhone" bundle:nil];
} else if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) {
    storyboard = [UIStoryboard storyboardWithName:@"MainStoryboard_iPad" bundle:nil];
}

self.EVC = [storyboard instantiateViewControllerWithIdentifier:@"InitialViewController"];
self.EVC.topViewController = [storyboard instantiateViewControllerWithIdentifier:@"HomeVC"];
4

2 に答える 2

1

個人的には、ホーム画面を最初からルート ビュー コントローラーにするのが好きでviewDidAppear、アニメーション化されていないモーダル セグエを介して自動的にログイン画面に移動します (performSegueWithIdentifierストーリーボードのセグエがフロー全体を表示するのではなく、フロー全体を表示することを好みます)。コントローラーを手動でインスタンス化して呼び出しますpushViewControllerが、何でもうまくいきます)。次に、ログインに成功したら、メイン画面に戻ります。そうすれば、最上位のコントローラーを変更する必要がなくなります。

したがって、私のストーリーボードは次のようになります。

ここに画像の説明を入力

したがって、私のメインの「ホーム」View Controllerには次のものがありますviewDidAppear

- (void)viewDidAppear:(BOOL)animated
{
    [super viewDidAppear:animated];

    if (![[Model sharedManager] loggedIn])
        [self performSegueWithIdentifier:@"login" sender:self];
}

明らかに、ログインしているかどうかを判断するためのロジックはさまざまですが、アイデアは理解できます。私のログインは、ログイン画面へのモーダル セグエ (アニメーションなし) を行い、一連のログイン画面でたまたまナビゲーション コントローラーを使用しています。

私の最終的な成功したログインプロセスは、次のことを行います。

- (IBAction)didTouchUpInsideDoneButton:(id)sender
{
    // ok, assuming at this point that everything has been validated and 
    // I'm ready to return, so just dismiss the navigation controller.
    // You could use unwind segue in iOS 6, as well.

    [[Model sharedManager] setLoggedIn:YES];

    [self.navigationController dismissViewControllerAnimated:YES completion:nil];
}
于 2013-04-15T22:15:28.033 に答える
0

application:didFinishLaunchingWithOptions: では、ユーザーが既にログインしているかどうかを確認し、ログインしている場合はプロファイルにジャンプします。

-(void)goToProfile {
    UIStoryboard *storyboard = self.window.rootViewController.storyboard;
    UINavigationController *rootNav = [storyboard instantiateViewControllerWithIdentifier:@"MainNavigationController"];
    if (![self.window.rootViewController isKindOfClass:[rootNav class]]) {
        self.window.rootViewController = rootNav;
    }
    else {
        [(UINavigationController *)self.window.rootViewController popToRootViewControllerAnimated:YES];
    }
}

didFinishLaunchingWithOptions には他に何も必要ありません。

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    // Override point for customization after application launch.
    if ([self isLoggedIn]) {
        [self goToProfile];
    }
    else {
        NSLog(@"Not logged in");
    }
    return YES;    
}

私のストーリーボードでは、プライマリ ブランチはサインアップ プロセスに進み、ログイン ビューのナビゲーション コントローラーには MainNavigationController のストーリーボード ID があります。 私の絵コンテ

于 2014-08-08T13:06:48.777 に答える