iOS应用程序崩溃UITextFieldDelegateMethod从硬件键盘输入变音符号

时间:2016-04-21 16:52:55

标签: ios objective-c cocoa-touch nsstring uitextfield

我的类被注册为文本字段委托,其部分功能包括实现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”。这是在尝试将其保存在字符串中时导致索引超出范围异常的原因。有没有人知道这种崩溃的方法?

1 个答案:

答案 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