web-dev-qa-db-ja.com

AppDelegateのStoryboardを使用してプログラムでビューコントローラーをインスタンス化する

私はアプリの構築に忙しい-初めて起動したときに、ユーザーに次の2つのことを行うように要求する。

  1. 国を選択
  2. T&Cを受け入れる

そこからホームビューコントローラに移動します。

私が現在直面している問題は、最初のビューコントローラーをアプリのデリゲートから画面にプッシュすることです。ストーリーボードを使用しています/ Xcode 5/iOS7

これが私が思いついたコードです:

UINavigationController *navigationController = (UINavigationController *)self.window.rootViewController;
UIStoryboard *mainStoryboard = [UIStoryboard storyboardWithName:@"Main_iPhone" bundle: nil];
BBCounterySettingsViewController *controller = (BBCounterySettingsViewController*)[mainStoryboard instantiateViewControllerWithIdentifier: @"CountrySettings"];
[navigationController pushViewController:controller animated:NO];

問題は、次のエラーでコードの最終行に到達するとアプリがクラッシュすることです。

*キャッチされない例外 'NSInvalidArgumentException'によりアプリを終了します、理由: '-[UIViewController pushViewController:animated:]:認識されないセレクターがインスタンス0x8e9a400に送信されました'

誰かが私が間違っていることについて何か考えを持っていますか?

11
Robert J. Clegg

self.window.rootViewControllerUINavigationControllerであると想定していますが、UIViewControllerです。これは、ストーリーボードの最も外側のView Controllerのタイプが間違っていることを意味します。

UINavigationController(この場合は動作するはずです)を取得するより良い方法は、UIViewControllerでプロパティself.navigationControllerを使用することです。

私が理解していることから、ユーザーが最初に実行するときにビューを提示して、ユーザーに何かを選択してもらいたいと思っています。次に、次のように、モーダルビューコントローラーを表示します。

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
//isFirstRun is some boolean you use to determine if it's the first run
if(isFirstRun){
    BBCounterySettingsViewController *controller = (BBCounterySettingsViewController *)[mainStoryboard instantiateViewControllerWithIdentifier: @"CountrySettings"];
    [self.window.rootViewController presentViewController: controller animated:YES completion:nil];
}
11
Rick

次の2つのことを行う必要があります。

  1. ストーリーボードで、コントローラー名(例:LoginView)に言及し、ストーリーボードIDの使用を有効にしました
  2. 次に、以下の行を使用します

    loginView = [storyboard instantiateViewControllerWithIdentifier:@"LoginView"];
    [(UINavigationController*)self.window.rootViewController pushViewController:loginView animated:NO];
    

お役に立てれば。それでも問題が解決しない場合はお知らせください。

7
Nattudurai
[self performSegueWithIdentifier:@"buyListSegue" sender:sender];
0
Gank

コントローラ識別子"CountrySettings"が間違ったコントローラに設定されています。 NavigationControllerを呼び出すことができるpushViewControllerを取得できません...

0
regetskcob