2011-12-30 16 views
9

ここでも似たような質問がありましたが、明確な答えはありません。だから、私は古典的なユーザー名/パスワードのフォーム、Facebookのログインボタン、そしてユーザーが初めてアプリケーションを起動したときに表示したいと思うサインアップボタンを持つモーダルログインビューを持っています。私が見つけたところから、これを実装するには2つの方法があります。 AppDelegateのdidFinishLaunchingWithOptions条件は、ユーザーがログインしているかどうかをチェックするために設定されている。そうでない場合はrootViewControllerがloginViewControllerに設定されている中ワンタイムログイン画面をストーリーボードで表示するためのベストプラクティス

  1. 。ログインが成功すると、アプリケーションのメインビューが表示されます。このaproachの私の問題は、私がrootViewControllerをメインビューにリセットする方法がわからないことです。それは可能ですか?

rootViewControllerを設定せずにログインモードを表示する方法はありますか?私はrVCをメインビューに保つことを意味します。 viewDidAppearのメインビューコントローラで

  1. 条件チェックユーザがログインしている場合。loginVCしないセグエが実行される場合。ユーザーが正常にログインすると、メイン・ビューに戻り、モーダル・ログイン・ビューを終了します。このaproachの問題は、私がしたくない主な見解が簡単に示されていることです。

  2. 他のアイデア?このシナリオでは、ベストプラクティスを教えてください。

+1

ここでいくつかの良い答えがあります:http://stackoverflow.com/questions/19962276/best-practices-for-storyboard-login-screen-handling-clearing-of-data-upon-logou –

答えて

1

あなたは単にナビゲーションコントローラを設定することにより、AppDelegateてrootViewControllerを設定することができ、事前にありがとう、そしてあなたがチェックを行うときに、あなたがで示されたいビューのいずれかのナビゲーションコントローラのルートビューを設定しますその時。私はあなたが何をしたいのためのif文を追加する場合、このようなものが動作するはずだと思う:

// Override point for customization after application launch. 
    RootViewController *rootController = [[RootViewController alloc] initWithNibName:nil bundle:nil]; 

    UINavigationController *navigationController = [[UINavigationController alloc] initWithRootViewController:rootController]; 

    self.window.rootViewController = navigationController; 
+0

はい私は認識していますappDelegateにrootViewControllerを設定します。私の問題は、ログインがアプリケーションのメインビューコントローラに行われた後にrootViewControllerをリセットすることです。それがどのように行われているのか、このアプローチを行うことをお勧めしますか。 –

+0

ログイン後にrootViewControllerになる必要があるのはなぜですか? –

+0

主に、ログインビューがまだビュースタックにないためです。また、開発中にそのオプションが後で必要になる場合は、ルートまですべてのView Controllerをポップするようなことを行うことができます。 –

3

多くの異なる方法を試した後、私はこれで、この問題を解決することができました:

-(void)viewWillAppear:(BOOL)animated { 

    // Check if user is already logged in 
    NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults]; 
    if ([[prefs objectForKey:@"log"] intValue] == 1) { 
     self.view.hidden = YES; 
    } 
} 

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

    // Check if user is already logged in 
    NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults]; 
    if ([[prefs objectForKey:@"log"] intValue] == 1) { 
     [self performSegueWithIdentifier:@"homeSeg3" sender:self]; 
    } 
} 

-(void)viewDidUnload { 
    self.view.hidden = NO; 
} 
3

私の意見では、このようなもののための最善の戦略は、アプリが起動したときにメインビューコントローラ上に既に表示されているログイン画面であり、ユーザーがサインインした後でうまく割り振り解除されます。 (と同様に提案:Best practices for Storyboard login screen, handling clearing of data upon logout)これをエレガントに達成していません。

昨日試して、いくつかの後、私はこれを行うための最善の方法は、子ビュー・コントローラを使用していると思う:

1.あなたは通常(追加する必要がないのと同じようにXcodeでメインインターフェイスのストーリーボードを選択します。あなたのappDelegate

main interface

2には何がviewDidLoadにあなたのメインビューコントローラに以下を追加します。

// If user is not logged in, show login view controller 
if (!isLoggedIn) { 
    // Instantiate Login View Controller from storyboard 
    UIStoryboard *mainSB = [UIStoryboard storyboardWithName:@"Main" bundle:[NSBundle mainBundle]]; 
    UIViewController *loginVC = [mainSB instantiateViewControllerWithIdentifier:@"Login"]; 

    // Set the Login View Controller's frame 
    loginVC.view.frame = self.view.bounds; 

    // Add login screen as a subview and as a child view controller 
    [self.view addSubview:loginVC.view]; 
    [self addChildViewController:loginVC]; 
    [loginVC didMoveToParentViewController:self]; 

    // Maintain a reference to the Login screen so we can dismiss it later 
    _loginVC = loginVC; 
} 

3.ユーザーがログインした後、通知またはデリゲートを使用してメインビューコントローラに通知します。次に、ログイン画面を任意の方法でアニメートできます。ここで私はディゾルブアニメーションを使用しています:

// Animate out the category chooser 
[UIView animateWithDuration:0.2 animations:^{ 
    // Dissolve the login screen away 
    [_loginVC.view setAlpha:0]; 
} completion:^(BOOL finished) { 
    // Remove login screen as a child view controller 
    [_loginVC willMoveToParentViewController:nil]; 
    [_loginVC.view removeFromSuperview]; 
    [_loginVC removeFromParentViewController]; 

    // nil out property 
    _loginVC = nil; 
}]; 

それだけです!このように、メインビューコントローラは常にあなたのウィンドウのルートビューコントローラであり、ログイン画面はユーザがログインした後に割り当てが解除され、最初にログイン画面を表示するときにフリッカーはありません。

関連する問題