在iOS中实现委托方法shouldChangeCharactersInRange时获取IndexOutofBoundsException

时间:2013-03-05 23:21:52

标签: ios uitextfield uitextfielddelegate

我的应用程序中有一个UITextField,我想要像计算器一样运行。我需要它的默认值为0.00,并且当用户输入数字时,数字从右向左移动,一次替换0.00一个数字的零,并且应用程序应该足够聪明以添加逗号(,)每三位数后。为此,我正在实现委托方法:

- (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'

当我尝试在文本字段中输入数字时,抛出此错误。谁能看到我做错了什么?

感谢所有回复的人。

1 个答案:

答案 0 :(得分:2)

是的,这就在这里:

[modifiedValue substringToIndex:modifiedValue.length-2]

似乎假设字符串的长度至少为2.

可能不是这样,至少当用户在空文本字段中输入他/她的第一个字符时。

如果长度大于两个字符,如何对整个事物进行长度检查,只做“shouldChangeCharactersInRange”方法的内容?