1

我在使用 Storyboard 的 iOS 项目中遇到导航控制器问题。

该项目的主要部分是一个UITabBar。当应用程序第一次加载屏幕 RegisterViewController 时:

注册视图控制器

当用户点击“注册”按钮时,会发出 HTTP POST 请求,然后在收到响应(JSON 对象)后,屏幕 QuestionnaireViewController 会使用:

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

问卷视图控制器

当用户点击 QuestionnaireViewController 中的单元格时,会向 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];
}

此时应用程序崩溃并出现以下错误:-[AnswersViewController viewControllers]: unrecognized selector sent to instance。

下面是对我的故事板的更全面的概述,这可能有助于理解我哪里出错了:

故事板

我很困惑如何解决这个问题,并希望有人能够提供帮助。

谢谢,尼克

4

2 回答 2

9

首先,你应该展示导航控制器,而不是它的根视图控制器。然后当你想用一些数据填充根视图控制器时,你需要将它作为导航控制器的根视图控制器来引用:

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

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

其次,在 prepareForSegue:sender: 你根本不需要引用导航控制器:

- (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];
}
于 2013-07-29T22:20:34.283 回答
2

您没有正确获取 navigationController。代替segue.destinationViewController,使用self.navigationController

通过调用 segue.destinationViewController,您将获得指向您正在转至 ( AnswersViewController) 的 VC 的指针,它不理解该消息viewControllers,因为它不是 UINavigationController。

AnswersViewController 也是 objectAtIndex:1 我相信,尽管检查一下。

于 2013-07-29T19:44:31.267 回答