使用unwindSegue / dictionaries数组进行测验

时间:2014-02-10 11:47:36

标签: ios iphone objective-c

我正在尝试做一个比我更有活力的测验。现在我的应用程序一次只能回答一个问题,因为我使用了一个开关,认为我可以使用它。我现在遇到的问题是,在返回到类别选择页面之前,我无法完成整个类别的问题。

现在我要说,我是编程的新手,我从这个网站获得了很多帮助来操纵我现在所拥有的东西,但是我无法绕过这个概念。我有几本来自O'Reilly和Programming Objective C第六版的书籍,我遇到了Segues和UnwindSegue,并认为这可能是我的答案。但是,我不知道如何以我想要的方式完全实现它。我想知道如何让应用程序提出问题,并在回答问题后立即显示正确/不正确的屏幕,并在屏幕上显示问题和正确答案,然后继续查看同一类别中的下一个问题。以下是我对我的问题的一个示例:

-(void)Category1{



    NSUInteger QuestionSelected= (arc4random() %100);

    switch (QuestionSelected) {
        case 0:

            QuestionText.text = [NSString stringWithFormat:@"Here is Question 1"];
            [Answer1 setTitle:@"Possible Answer" forState:UIControlStateNormal];
            [Answer2 setTitle:@"Possible Answer" forState:UIControlStateNormal];
            [Answer3 setTitle:@"Possible Answer" forState:UIControlStateNormal];
            [Answer4 setTitle:@"Possible Answer" forState:UIControlStateNormal];
            Answer1Correct = YES;
            CorrectAnswerDisplay.text = [NSString stringWithFormat:@"Correct Answer"];
            break;
        case 1:
            QuestionText.text = [NSString stringWithFormat:@"Here is Question 2"];
            [Answer1 setTitle:@"Possible Answer" forState:UIControlStateNormal];
            [Answer2 setTitle:@"Possible Answer" forState:UIControlStateNormal];
            [Answer3 setTitle:@"Possible Answer" forState:UIControlStateNormal];
            [Answer4 setTitle:@"Possible Answer" forState:UIControlStateNormal];
            Answer1Correct = YES;
            CorrectAnswerDisplay.text = [NSString stringWithFormat:@"Correct Answer"];
            break;

我这样做的原因是我能够通过开关掉落(我不明白开关的特性,以及我做了更多的研究之后......我不确定我是否仍然会这样做我知道它不再是正确的方式了。)

在Apple使用UnwindSegue发布的示例中,他们使用了一个充满问题的.plist。如果我使用plist和segues在我的视图控制器之间来回转换,我可以在问题之间设置正确/不正确的屏幕吗?现在我有五个类别,这就是我的故事板的设置方式:

感应控制器> 没有什么特别的,这个只是一个按钮去分类

类别选择屏幕>
在此列出了可供选择的五个单独类别

问题/答案ViewController>

这里有一个标签和四个按钮,用于显示从开关提取的任何问题/答案以及另一个标签,以便在选择了一个选项并且按钮消失后显示正确的答案。

所以重申顺序希望明确,现在我将选择一个类别,它将把我带到我的第三个ViewController。它会问我一个问题,然后显示四个可能的答案供选择。我将选择一个答案,它将保留在第三个视图控制器中并显示我是否正确/不正确,仍显示问题并显示正确答案。然后在底部我有一个按钮返回到类别页面,我可以再次选择相同的类别。

我正在尝试这个应用程序,仅仅是为了学习如何利用segues进行内存管理,并尝试理解开发的动态方面。我并不是想为我完成答案,所以如果你愿意稍微解释一下这个过程,我会非常感激,或者如果我对正在发生的事情的逻辑有一些疑问,请保持温和。再次感谢大家的帮助。这个网站真的是我的祝福。

编辑:如果我过早地提出这个问题,我很抱歉,但有时候我猜你必须要弄清楚这个问题。我认为使用NSDictionary是理想的方法。我不太熟悉使用一系列字典,但是其他人发送给我:

- (void)categoryOne
{
    NSUInteger questionSelected = arc4random_uniform((u_int32_t)self.arrayOfQuestions.count);

    NSDictionary *thisQuestion = self.arrayOfQuestions[questionSelected];

    [questionsLabel setText:thisQuestion[@"question"]];

    [answerOneButton setTitle:thisQuestion[@"answer1"] forState:UIControlStateNormal];
    [answerTwoButton setTitle:thisQuestion[@"answer2"] forState:UIControlStateNormal];
    [answerThreeButton setTitle:thisQuestion[@"answer3"] forState:UIControlStateNormal];
    [answerFourButton setTitle:thisQuestion[@"answer4"] forState:UIControlStateNormal];

    answer1Correct = YES;
    correctAnswerDisplay.text = thisQuestion[@"answer"];
}

我将阅读有关使用数组的更多信息,看看我是否能更多地了解如何实现它以及它如何与我的测验应用程序相关。我越是越过这些,它就会更有意义。这个网站真的有奇迹,我只是不想误解,看起来像个白痴或有人要求分发。

附上我试图维护的问答屏幕的一些图片。

Question Page

Answer Page

1 个答案:

答案 0 :(得分:0)

实现你想要的东西应该相当容易。您需要关注QuestionViewController中的didSelectRowAtIndexPath:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    [tableView deselectRowAtIndexPath:indexPath animated:NO];

    // This method is called regardless of the value returned by 
    // -shouldPerformSegueWithIdentifier:.  Therefore, check if this view
    // controller is displaying the final question and advance to the results
    // screen only if it is.
    if (indexPath.section == 1 && self.lastQuestion)
    {
        self.currentQuiz[self.questionIndex].selectedResponse = indexPath.row;

        // Trigger the segue leading to the results screen.
        [self performSegueWithIdentifier:@"ResultScreen" sender:self];
    }
}

当用户通过更新例如UILabel选择你想要处理的答案时,而不是触发下一个segue。简而言之,只需删除行[self performSegueWithIdentifier ...]并输入一些代码来更新屏幕是否正确或不正确。当您准备好返回上一个屏幕然后实现倒带时。