0

我对Objective c很陌生,当我遇到困难时,我会通过使用谷歌等慢慢学习,但我被这个卡住了好几个小时。我正在做一个基本测验,答案是数字。我有2个数组问题和答案,我将阵列索引在一起,NSLOG表明它们是对的,但是我的代码只是在选择正确的答案时就不同意。答案总是错误的,即使你 nslogs 说它是对的。谢谢你的帮助

_arrayQuestions = [[NSArray alloc] initWithObjects:
                   @"what is johns age?",  
                   @"What is daves age ",   
               nil];


_arrayAnswers = [[NSArray alloc] initWithObjects:
                 @"32",@"42",
                 nil];



- (void)setQuestions {

    currentQuestionIndex++;

    if (currentQuestionIndex == [_arrayQuestions  count]) {
        currentQuestionIndex = 0;
    }

    NSString *question = [_arrayQuestions           objectAtIndex:currentQuestionIndex];

    NSLog(@"displaying question: %@", question); 
    [_questionLabel setText:question];

    // NSLog(@"current answers: %@",[ _arrayAnswers objectAtIndex:currentQuestionIndex]);
}


- (void)checkingAnswers {

    // usersAnswer  = _DateField.text  ;

    answer = [_arrayAnswers objectAtIndex:currentQuestionIndex];

    // int intAnswer = [answer intValue];
    // NSLog(@"answer = : %@", usersAnswer );

    NSLog(@"answer = : %@", _DateField.text);
    NSLog(@"answer = : %@", answer);

    if ( _DateField.text == answer) {

        NSString *rightAnswer = [[NSString alloc] initWithFormat:@"Correct" ];
        [_answerLabel setText : rightAnswer];

    } else {

        NSString *wrongAnswer = [[NSString alloc] initWithFormat:@"Wrong" ];

        if (  [_DateField.text length] ==2 ) {
            [_answerLabel setText : wrongAnswer];
        }
}

- (IBAction)numbersPressed:(UIButton *)sender {

    if ( [_DateField.text length] <=1) {

        NSString *number = sender.currentTitle;
        _DateField.text = [ _DateField.text stringByAppendingString: number];

        [self checkingAnswers];

    }

}
4

3 回答 3

1

Objective-C 对象和引用与良好的 C 原语之间有一个重要的区别。

// C
int a = 2;
if (a == 2)
{
    do_something();
}

前面的代码有效,因为==操作员检查变量中包含的值a

另一方面,如果您执行以下操作:

// Objective-C
NSString *str1 = @"Hello";

if (str1 == @"Hello")
{
    [self doSomething]
}

str1现在将内存地址保存到一个 Obj-C 对象,该对象保存字符串“Hello”的每个字符。如果您要使用 打印它NSLog(@"%p",str1),它可能会显示一个十六进制地址,例如0xC35AF3.

话虽如此,上面的代码不起作用,仅仅是因为==不是比较变量的真实内容,而是比较它们的地址,因为那str1是持有的,一个依赖于体系结构的地址指针。从这个意义上说,操作员==只会检查字符串是否完全相同,因为它们都指向内存中的相同字符串。

您的代码正在执行类似的操作,但只有 Obj-C 字符串存储在数组中,您只是在使用用户输入进行检查。

在这种情况下,使用 方法[stringA isEqualToString:stringB],该方法在 Obj-C 字符串中逐个字符地检查。

我建议你在使用 ObjC 之前牢牢掌握 C 编程的基础知识,因为你会比你想象的更多地处理它们,特别是如果你来自一个解释过的不思考记忆语。检查 K&R C 和手册页。

于 2013-07-11T08:10:57.623 回答
0

不要使用“==”。使用 isEqualToString: 。"==" 正在测试地址的相等性,而不是对象本身。这两个 NSString 没有相同的地址,因为它们是不同的具有相同值的 NSString(一个是您的正确答案,另一个是用户提交的答案)。

于 2013-07-11T07:58:24.053 回答
0

也许你的意思是这样的:

- (IBAction)numbersPressed:(UIButton *)sender 
{
    _DateField.text = sender.currentTitle;
    [self checkingAnswers];
}

代替

- (IBAction)numbersPressed:(UIButton *)sender {

    if ( [_DateField.text length] <=1) {
        NSString *number = sender.currentTitle;
        _DateField.text = [ _DateField.text stringByAppendingString: number];


        [self checkingAnswers];


    }
于 2013-07-11T08:11:31.897 回答