2012-04-13 7 views
2

条件付きでビューのコントローラをApp Delegateからロードする方法はありますか?iOS:条件付きでビューコントローラをロードする

たとえば、これはできますか?

if (hasUserSignedUp) { 
     nav = [[navController alloc] initWithNibName:nil bundle:nil]; 
     [window addSubview:nav.view]; 
     [window makeKeyAndVisible]; 
    } 
    else { 
     su = [[SignUpViewController alloc] initWithNibName:nil bundle:nil]; 
     [window addSubview:su.view]; 
     [window makeKeyAndVisible]; 
    } 
+1

私はこれを投票するべきではないと思います。本質的に技術的な質問でもありますが、それはまた、 'applicationDidFinishLaunching:'メソッドが果たす役割の中心になる哲学的な質問です。 –

+0

私はそれを試してみました。それ以外の場合は、質問を投稿する必要はありません。 – rosst400

+2

"これはコンパイルして実行しますか?"以外の意味を持つ場合は、 – mydogisbox

答えて

1

はい、これは特に制限はありません。

しかし、ビューを追加するのではなく、rootViewControllerを設定する方がよいでしょう。

self.window.rootViewController = nav;//or su; 
1

これは良いアイデアは、彼らがサインアップしてしまった場合に応じて、どちらの場合も、あなたのナビゲーションコントローラをロードすることで、おそらく何、確かに可能ですが、別のルートビューコントローラを使用します。

if (hasUserSignedUp) { 
    nav = [[UINavigationController alloc] initWithRootViewController:rootViewController]; 
} 
else { 
    su = [[SignUpViewController alloc] initWithNibName:nil bundle:nil]; 
    nav = [[UINavigationController alloc] initWithRootViewController:su]; 
} 

[window addSubview:nav.view]; 
[window makeKeyAndVisible]; 

app deleteはビュー階層のルートを作成する必要があります。そこから、適切に表示されるように操作できます。私があなただったら

、私は上記のコードを使用すると、彼らが署名またはサインアップした後、通常のルートビューコントローラをプッシュしてから修正するでしょうNAVスタックスタック:

[self.navigationController pushViewController:rootViewController animated:YES]; 

double delayInSeconds = 0.5f; 
dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, delayInSeconds * NSEC_PER_SEC); 
dispatch_after(popTime, dispatch_get_main_queue(), ^(void){ 
    self.navigationController.viewControllers = [NSArray arrayWithObject:self.navigationController.viewControllers.lastObject]; 
}); 

このISN」これを行う最もクリーンな方法(dispatch_after)ですが、どのように処理されているのか分かります。 rootViewControllerにhidesBackButtonYESに設定されていることを確認してください。 rootViewControllerが

0

はい、あなたは確かにそのように行うことができます良い習慣です