简体   繁体   中英

iOS Storyboard - Navigation Controller Not Working

I am having trouble with a Navigation Controller in my iOS project which uses Storyboards.

The main part of the project is a UITabBar. When the app loads for the very first time the screen RegisterViewController is presented:

注册视图控制器

When the user taps on the "Register" button a HTTP POST request is made, then upon receiving the response (JSON object) the screen QuestionnaireViewController is presented using:

UIStoryboard *mainStoryboard = [UIStoryboard storyboardWithName:@"MainStoryboard" bundle:nil];

QuestionnaireViewController *questionnaireViewController = [mainStoryboard instantiateViewControllerWithIdentifier:@"QuestionnaireView"];
[questionnaireViewController setModalTransitionStyle:UIModalTransitionStyleCrossDissolve];
[questionnaireViewController setQuestionsAndAnswers:_questionsAndAnswers];

[self presentViewController:questionnaireViewController animated:NO completion:nil];

问卷视图控制器

When the user taps on a cell in QuestionnaireViewController a message is sent to prepareForSegue:sender:

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    UINavigationController *navigationController = segue.destinationViewController;

    AnswersViewController *answersViewController = [[navigationController viewControllers] objectAtIndex:0];

    NSIndexPath *indexPath = [self.tableView indexPathForCell:sender];
    NSArray *answers = [[_questionsAndAnswers objectAtIndex:indexPath.row] objectForKey:@"answers"];

    [answersViewController setAnswers:answers];
}

At this point the app crashes with an error of: -[AnswersViewController viewControllers]: unrecognized selector sent to instance.

Below is a more comprehensive overview of my storyboard, which may help in understanding where I have gone wrong:

故事板

I am stumped as to how to fix this, and am hoping that someone out there is able to help.

Thanks, Nick

First, you should present the navigation controller, not its root view controller. Then when you want to populate the root view controller with some data, you need to reference it as the navigation controller's root view controller:

UINavigationcontroller *questionnaireNavController = [self.storyboard instantiateViewControllerWithIdentifier:@"QuestionnaireNavigationController"];
[questionnaireNavController setModalTransitionStyle:UIModalTransitionStyleCrossDissolve];
QuestionnaireViewController *qvc = (QuestionnaireViewController *)[questionnaireNavController topViewController];
[qvc setQuestionsAndAnswers:_questionsAndAnswers];

[self presentViewController:questionnaireNavController animated:NO completion:nil];

Second, in prepareForSegue:sender: you don't need to reference a navigation controller at all:

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
    AnswersViewController *answersVC = segue.destinationViewController;
    NSIndexPath *indexPath = [self.tableView indexPathForCell:sender];
    NSArray *answers = [[_questionsAndAnswers objectAtIndex:indexPath.row] objectForKey:@"answers"];

    [answersVC setAnswers:answers];
}

You are not getting the navigationController properly. Instead of segue.destinationViewControlle r, use self.navigationController

By calling segue.destinationViewController, you are getting a pointer to the VC you are segueing to ( AnswersViewController ) which doesn't understand the message viewControllers because it is not a UINavigationController.

Also the AnswersViewController is objectAtIndex:1 I believe, check this though.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM