Почему мое заявление if не работает с первого раза? (Objective-C, Xcode, iPhone) - PullRequest
1 голос
/ 05 сентября 2011

Новый для OB-C здесь. Java программист по профессии.

Это пример из моего файла view.m. У меня есть дисплей, который берет некоторые цифры с кнопок. Если на дисплее отображается 0, он должен сначала очистить 0 перед добавлением новых чисел.

- (IBAction) btn1:(id) sender{[self numPress: (NSString *) @"1"];};
- (IBAction) btnClear:(id) sender{display.text = @"0";};

- (void) numPress : (NSString *) key {
    if (display.text ==  (NSString *) @"0")
        display.text = @"";
    display.text =  [display.text stringByAppendingString: key];
}

- (void) viewDidLoad {
    self.display.text = (NSString *) @"0";
}

Когда я запускаю его, как показано, на дисплее отображается «0», затем, если я нажимаю «1», дисплей меняется на «01». Если я нажимаю «Очистить», дисплей сбрасывается на «0», затем, если я снова нажимаю «1», он меняется на «1». (ожидаемый результат). Когда я в первый раз нажал '1', 0 должен был быть удален.

Если я изменю viewDidLoad, чтобы установить display.text на «2», и изменим условие оператора numPress, если на «2», это сработает.

- (IBAction) btn1:(id) sender{[self numPress: (NSString *) @"1"];};
- (IBAction) btnClear:(id) sender{display.text = @"0";};

- (void) numPress : (NSString *) key {
    if (display.text ==  (NSString *) @"2")
        display.text = @"";
    display.text =  [display.text stringByAppendingString: key];
}

- (void) viewDidLoad {
    self.display.text = (NSString *) @"2";
}

Я строю, затем запускаю, и на дисплее отображается «2». Я нажимаю «1», и дисплей меняется на «1». (убирая ведущий '2' как следует).

Может ли кто-нибудь помочь мне здесь, почему «2» работает, но «0» не срабатывает (но только в первый раз), что поражает меня?

Ответы [ 2 ]

4 голосов
/ 05 сентября 2011

Используйте -isEqualToString: вместо сравнения указателей (с ==).

if ([display.text isEqualToString:@"..."])
    /* ... */ ;
2 голосов
/ 05 сентября 2011

Вы обнаружите, что делаете неправильные сравнения

== при использовании с указателями сравнивает фактические значения указателя, а не фактические объекты.

Вы должны переписать это к этому.

- (IBAction) btn1:(id) sender {[self numPress:@"1"];}; // no need to cast, you have an NSString literal
- (IBAction) btnClear:(id) sender {display.text = @"0";};

- (void) numPress : (NSString *) key {
    if (display.text isEqualToString:@"0")
        display.text = @"";
    display.text =  [display.text stringByAppendingString: key];
}

- (void) viewDidLoad {
    self.display.text = @"0"; // again you have a literal
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...