我的类被注册为文本字段委托,其部分功能包括实现textField:shouldChangeCharactersInRange:replacementString,如下所示:
- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string {
self.stateHolder.fieldValue = [self.stateHolder.fieldValue stringByReplacingCharactersInRange:range withString:string];
return YES;
}
当从硬件键盘输入变音符号到空文本字段时,我开始注意到崩溃。这是我看到的错误:
Terminating app due to uncaught exception 'NSRangeException', reason: '-[__NSCFString replaceCharactersInRange:withString:]: Range or index out of bounds'
当从硬件键盘输入变音符号时,与输入相关的范围似乎是“location = 1,length = 0”。这是在尝试将其保存在字符串中时导致索引超出范围异常的原因。有没有人知道这种崩溃的方法?
答案 0 :(得分:0)
fieldValue长度应大于或等于替换字符串长度,否则不能有足够的范围来替换字符。
- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string {
if(self.stateHolder.fieldValue.length>=string.length){
self.stateHolder.fieldValue = [self.stateHolder.fieldValue stringByReplacingCharactersInRange:range withString:string];
}
return YES;
}
例如:
fieldValue= @"Hello"; length=5
replacementString=@"'"; length=1 1 can be replaced in 5
fieldValue= @""; length=0 length 0 or nil,
replacementString=@"'"; length=1 , but not 1 can be replaced in 0