使用AppDelegate中的Storyboard以编程方式实例化View Controller

时间:2013-12-12 09:53:25

标签: ios objective-c uistoryboard

我正在忙着构建一个应用程序 - 当它第一次启动它时会要求用户做两件事:

  1. 选择国家/地区
  2. 接受T& Cs
  3. 从那里进入家庭视图控制器。

    我目前面临的问题是将第一个视图控制器从我的应用代表推送到屏幕上。我正在使用故事板/ 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'

    任何人都有任何想法我做错了什么?

4 个答案:

答案 0 :(得分:11)

您希望self.window.rootViewControllerUINavigationController,但它是UIViewController。这意味着故事板中最外层的视图控制器类型错误。

获取UINavigationController(在这种情况下应该适用)的更好方法是在任何self.navigationController上使用属性UIViewController

根据我的理解,您希望在用户第一次运行时让用户选择一些内容。你应该做的是提供一个模态视图控制器,如下所示:

- (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];
}

答案 1 :(得分:7)

您需要做两件事:

  1. 在Storyboard中,您提到了控制器名称(例如LoginView)并启用了故事板ID
  2. 然后您有用户以下行

    loginView = [storyboard instantiateViewControllerWithIdentifier:@"LoginView"];
    [(UINavigationController*)self.window.rootViewController pushViewController:loginView animated:NO];
    
  3. 希望这会有所帮助。如果你还有这个问题,请告诉我。

答案 2 :(得分:0)

[self performSegueWithIdentifier:@"buyListSegue" sender:sender];

答案 3 :(得分:0)

我认为控制器标识符"CountrySettings"设置为错误的控制器。您没有收到NavigationController,可以致电pushViewController ...