在获得NSArray的价值后,让程序继续前进

时间:2013-07-11 07:53:20

标签: objective-c nsarray

我对Objective c非常新,当我遇到困境时,我会慢慢学习谷歌等,但我已经被困了几个小时。 我做了一个基本测验,答案是数字。 我有2个数组问题和答案我得到数组索引在一起,NSlog显示他们是正确的但我的代码只是不同意选择正确的答案。 即使你说它的权利,答案总是错误的。 谢谢你的帮助

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

    }

}

3 个答案:

答案 0 :(得分: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&amp; R C和手册页。

答案 1 :(得分:0)

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

答案 2 :(得分: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];


    }