Instantiating a View Controller programmatically with Storyboard from AppDelegate

混江龙づ霸主 提交于 2019-12-18 12:26:28

问题


I'm busy building an app - that when launched for the first time it asks the user to do two things:

  1. Select a Country
  2. Accept T&Cs

From there it goes to the home view controller.

The problem I am currently facing is pushing the first view controller onto the screen from my app delegate. I'm using storyboards / Xcode 5/ iOS7

Here is the code I came up with:

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

The problem is the app crashes when it hits the last line of code with the following error:

* Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[UIViewController pushViewController:animated:]: unrecognized selector sent to instance 0x8e9a400'

Anyone have any ideas what I am doing wrong?


回答1:


You're expecting the self.window.rootViewController to be a UINavigationController but it's a UIViewController. This means that the outermost view controller in your storyboard is of the wrong type.

A better way to obtain the UINavigationController (Which should work in this case) is to use the property self.navigationController on any UIViewController.

From what I understand you want to present a view the first time the user runs to have the user pick some stuff. What you should then do is present a modal view controller, like this:

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



回答2:


There are two things you need to do:

  1. In Storyboard you have mentioned the controller name (eg LoginView) and enable use storyboard ID
  2. Then you have user the below line

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

Hope this helps. Let me know if you're still having the issue.




回答3:


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



回答4:


I think the controller identifier "CountrySettings" is set to the wrong controller. You're not getting a NavigationController where you can call pushViewController...



来源:https://stackoverflow.com/questions/20540125/instantiating-a-view-controller-programmatically-with-storyboard-from-appdelegat

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!