私はiOSプログラミングを始めたばかりですが、これまでのところ、ここで見つけたチュートリアルと回答は、前進するための大きな助けになっています。しかし、この特定の問題は一晩中私を悩ませてきました、そして私は「正しいと感じる」答えを見つけることができません。
リモートサービスに接続するアプリケーションを作成していますが、ユーザーはそれを使用する前にサインインする必要があります。アプリケーションの使用を開始すると、最初のビューはサインインダイアログになります。以前に認証したことがある場合は、すぐに概要ページが表示されます。
このプロジェクトではストーリーボードを使用していますが(これはすばらしい機能だと思います)、ルートビューコントローラーを選択して読み込むコードのほとんどはすでに処理されています。ロジックを追加するのに最適な場所は、 :のapplication:didFinishLaunchingWithOptions:
メソッドだと思いました。AppDelegate
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:
(NSDictionary *)launchOptions
{
// select my root view controller here based on credentials present or not
return YES;
}
しかし、これは2つの質問を引き起こしました:
この特定のデリゲートメソッド内では、ストーリーボードに基づいてルートビューコントローラーがすでに選択(およびロード?)されています。ロードプロセスの以前の場所に移動して、最初のView Controllerの選択を上書きできますか、それとも不必要に問題を複雑にしますか?
最初のViewControllerをオーバーライドするには、ストーリーボードへの参照が必要ですが、の
storyboardWithName:bundle:
コンストラクターを使用するよりも良い方法を見つけることができませんでしUIStoryboard
た。それは間違っていると感じます。アプリケーションにはすでにストーリーボードへの参照が含まれているはずですが、どうすればそれにアクセスできますか?
アップデート
私はここで私の答えを見つけたので、私が持っていた2番目の問題を解決しました:
UIStoryboard:アクティブなストーリーボードを取得する正しい方法は何ですか?
NSBundle *bundle = [NSBundle mainBundle];
NSString *sbFile = [bundle objectForInfoDictionaryKey:@"UIMainStoryboardFile"];
UIStoryboard *sb = [UIStoryboard storyboardWithName:sbFile bundle:bundle];
上記は、新しいストーリーボードインスタンスを作成します。アクティブなインスタンスを取得するには、はるかに簡単です。
UIStoryboard *sb = [[self.window rootViewController] storyboard];
ストーリーボードファイル自体で、ロードするビューの識別子を設定する必要がありますLoginDialog
。その後、次のようにビューをインスタンス化します。
LoginViewController *login = [sb instantiateViewControllerWithIdentifier:@"LoginDialog"];
[self.window setRootViewController:login];
別のViewController内では、次で十分です。
UIStoryboard *sb = self.storyboard;
LoginViewController *login = [sb instantiateViewControllerWithIdentifier:@"LoginDialog"];
[self presentViewController:login animated:NO completion:nil];