1

ストーリーボードを使用する 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 を呼び出すことにより、セグエ先の VC へのポインターを取得します ( AnswersViewController)。これは、UINavigationController ではないため、メッセージを理解できませんviewControllers

また、 AnswersViewController は objectAtIndex:1 だと思いますが、これを確認してください。

于 2013-07-29T19:44:31.267 に答える