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

Rob*_*egg 11 objective-c ios uistoryboard

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

  1. 选择一个国家
  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];
Run Code Online (Sandbox Code Playgroud)

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

*由于未捕获的异常'NSInvalidArgumentException'终止应用程序,原因:' - [UIViewController pushViewController:animated:]:无法识别的选择器发送到实例0x8e9a400'

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

Ric*_*ick 11

你期待它self.window.rootViewController是一个,UINavigationController但它是一个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];
}
Run Code Online (Sandbox Code Playgroud)


小智 7

您需要做两件事:

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

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

希望这可以帮助.如果你还有这个问题,请告诉我.