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

我正忙于构build一个应用程序 – 第一次启动时,它要求用户做两件事情:

  1. select一个国家
  2. 接受条款和条件

从那里到主视图控制器。

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

问题是应用程序崩溃,当它遇到以下错误的最后一行代码:

*终止应用程序由于未捕获的exception“NSInvalidArgumentException”,原因:' – [UIViewController pushViewController:animation:]:无法识别的select发送到实例0x8e9a400'

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

你期待self.window.rootViewController是一个UINavigationController但它是一个UIViewController 。 这意味着故事板中最外面的视图控制器的types是错误的。

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

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

 - (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. 在Storyboard中,您提到了控制器名称(例如,LoginView)并启用了使用Storyboard ID
  2. 然后你有用户在下面的线

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

希望这可以帮助。 让我知道如果你仍然有这个问题。

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

我认为控制器标识符"CountrySettings"被设置为错误的控制器。 你没有得到一个NavigationController ,你可以调用pushViewController