2013-03-05 4 views
1

У меня есть UITextField в моем приложении, что я хочу работать как калькулятор. Мне нужно, чтобы оно имело значение по умолчанию 0.00, и когда пользователь вводит цифры, цифры перемещаются справа налево, заменяя нули в 0.00 по одной цифре за раз, и приложение должно быть достаточно умным, чтобы добавлять запятые (,), после каждых трех цифр. Чтобы сделать это, я реализую метод делегата:Получение IndexOutofBoundsException при реализации метода делегата shouldChangeCharactersInRange в iOS

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string {} 

следующим образом:

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string { 

if([[string stringByTrimmingCharactersInSet:[NSCharacterSet controlCharacterSet]] 
    isEqualToString:@""]) 
    return YES; 

NSString *previousValue = [[[textField.text stringByTrimmingCharactersInSet:[[NSCharacterSet decimalDigitCharacterSet] invertedSet]] stringByReplacingOccurrencesOfString:@"." withString:@""] stringByReplacingOccurrencesOfString:@"," withString:@""]; 
string = [string stringByTrimmingCharactersInSet:[[NSCharacterSet decimalDigitCharacterSet] invertedSet]]; 
NSString *modifiedValue = [NSString stringWithFormat:@"%@%@",previousValue,string]; 
modifiedValue = [NSString stringWithFormat:@"%@.%@",[modifiedValue substringToIndex:modifiedValue.length-2],[modifiedValue substringFromIndex:modifiedValue.length-2]];//this is the line that is causing the error 

NSNumberFormatter *formatter = [[NSNumberFormatter alloc] init]; 
[formatter setNumberStyle:NSNumberFormatterCurrencyStyle]; 
modifiedValue = [formatter stringFromNumber:[NSNumber numberWithFloat:[modifiedValue floatValue]]]; 

textField.text = modifiedValue; 
return NO; 

}

Однако, я получаю следующее сообщение об ошибке:

'NSRangeException', reason: '*** -[__NSCFString substringToIndex:]: Range or index out of bounds' 

Этот ошибка была брошена в тот момент, когда я попытался ввести число в текстовое поле. Может ли кто-нибудь увидеть, что я делаю неправильно?

Заранее благодарим всех, кто отвечает.

ответ

2

Да, этот бит здесь:

[modifiedValue substringToIndex:modifiedValue.length-2] 

, кажется, предполагает, что длина строки составляет по меньшей мере 2.

Что, вероятно, не является, по крайней мере, когда пользователь печатает его/ее первый символ в пустое текстовое поле.

Как насчет того, чтобы проверять длину всего объекта, только делая кишки метода «shouldChangeCharactersInRange», если длина больше двух символов?

+0

Спасибо, ваше решение сработало! – syedfa