iOS情节提要-导航控制器不工作

iOS情节提要-导航控制器不工作,ios,uiviewcontroller,uinavigationcontroller,storyboard,uitableview,Ios,Uiviewcontroller,Uinavigationcontroller,Storyboard,Uitableview,我的iOS项目中使用故事板的导航控制器有问题 该项目的主要部分是一个修道院。当应用程序首次加载时,屏幕RegisterViewController将显示: 当用户点击“注册”按钮时,会发出HTTP POST请求,然后在收到响应(JSON对象)后,屏幕上会出现以下问题: UIStoryboard *mainStoryboard = [UIStoryboard storyboardWithName:@"MainStoryboard" bundle:nil]; QuestionnaireViewC

我的iOS项目中使用故事板的导航控制器有问题

该项目的主要部分是一个修道院。当应用程序首次加载时,屏幕RegisterViewController将显示:

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

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

当用户点击QuestionnaReviewController中的单元格时,会向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 viewcontroller]:无法识别的选择器已发送到实例

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

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

谢谢,
尼克

您没有正确获取导航控制器。不要使用
segue.destinationViewControlle
r,而是使用
self.navigationController

通过调用segue.destinationViewController,您将获得一个指向您要进入的VC(
AnswersViewController
)的指针,该VC不理解消息
viewcontroller
,因为它不是UINavigationController


另外,答案是objectAtIndex:1我相信,请检查此项。

您没有正确获取导航控制器。不要使用
segue.destinationViewControlle
r,而是使用
self.navigationController

通过调用segue.destinationViewController,您将获得一个指向您要进入的VC(
AnswersViewController
)的指针,该VC不理解消息
viewcontroller
,因为它不是UINavigationController


另外,AnswersViewController是objectAtIndex:1我相信,请检查这一点。

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

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

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

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

这在很大程度上是正确的,但他似乎甚至没有分配AnswersViewController,这样它就不会存储在navigationController的viewcontroller数组中,如果它是情节提要中的viewcontroller,那么他应该使用[storyboard InstanceWithiIdentityer:@”“;如果它是选项卡视图控制器的选项卡,那么他应该执行[tabControlelr viewControllerAtIndex:];这不是写函数,但是会有类似于Dylan的功能,非常感谢您的快速响应。如果我将其更改为self.navigationController,则会出现以下错误:“推送序列只能在源控制器由UINavigationController实例管理时使用。”根据您的屏幕截图(下一个),QuestionViewController和AnswerViewController都嵌入到UINavigationController中。确认确实如此。如果QuestionViewController不在导航堆栈中,请将其嵌入其中。(@A'saDickens如果AnswersViewController位于故事板的导航堆栈中,则应从nib实例化)Dylan,QuestionnaReviewController嵌入到UINavigationController中,QuestionViewController具有QuestionnaReviewController的推送序列。我还添加了一个新图像,对我的故事板进行了更全面的概述。我的建议是使用调试器逐步完成prepareForSegue,并确认self.navigationController不是零,确认self是一个QuestionnaReviewController,并检查一切是否正常,如果不起作用,在github上发布,我会检查一下。这在很大程度上是正确的,但似乎他甚至没有分配AnswersViewController,这样它就不会存储在navigationController的viewcontroller数组中,如果它是情节提要中的viewcontroller,那么他应该使用[storyboard InstanceWithiIdentifier:@”“;如果它是选项卡视图控制器的选项卡,那么他应该执行[tabControlelr viewControllerAtIndex:];这不是写函数,但是会有类似于Dylan的功能,非常感谢您的快速响应。如果我将其更改为self.navigationController,则会出现以下错误:“推送序列只能在源控制器由UINavigationController实例管理时使用。”根据您的屏幕截图(下一个),QuestionViewController和AnswerViewController都嵌入到UINavigationController中。确认确实如此。如果QuestionViewController不在导航堆栈中,请将其嵌入其中。(@A'saDickens如果AnswersViewController位于故事板的导航堆栈中,则应从nib实例化)Dylan,QuestionnaReviewController嵌入到UINavigationController中,QuestionViewController具有QuestionnaReviewController的推送序列。我还添加了一个新图像,对我的故事板进行了更全面的概述。我的建议是使用调试器逐步完成prepareForSegue,并确认self.navigationController不是零,确认self是一个QuestionnaReviewController,并检查一切是否正常,如果不起作用,在github上发布,我会查看。你不应该展示QuestionnaReviewController,你应该展示它嵌入的导航控制器。然后在prepareForSegue中,您不需要对导航控件执行任何操作