ReplacingCharactersInRange越界错误:UITextField数字字符替换问题
问题解决:UITextField字符串替换越界异常
错误原因
Objective-C中字符串的索引是从0开始的,你要替换的第8个字符对应的索引是7,而非8。当文本长度刚好等于8时,NSMakeRange(8,1)的起始位置8已经超出了字符串的最大索引7(长度为8的字符串,索引范围是0~7),因此触发越界异常。另外当前代码未考虑重复替换的情况,替换后文本已有小数点,再次输入时会继续执行替换逻辑,引发错误。
修正后的代码
基础修正(解决越界问题)
if (self.txtQty.text.length >= 8) { // 第8个字符对应索引为7,截取长度1 NSRange range = NSMakeRange(7, 1); self.txtQty.text = [self.txtQty.text stringByReplacingCharactersInRange:range withString:@"."]; }
严谨版(防止重复添加小数点)
如果需要在用户输入过程中实时处理,建议在UITextFieldDelegate代理方法中实现,避免重复添加小数点:
- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string { if (textField == self.txtQty) { NSString *newText = [textField.text stringByReplacingCharactersInRange:range withString:string]; // 仅在无小数点且文本长度达到8时执行替换 if ([newText rangeOfString:@"."].location == NSNotFound && newText.length >= 8) { NSRange dotRange = NSMakeRange(7, 1); textField.text = [newText stringByReplacingCharactersInRange:dotRange withString:@"."]; return NO; // 手动修改文本后返回NO,阻止系统默认输入逻辑 } } return YES; }
额外注意
- 确保你的UITextField已设置代理,并正确实现上述代理方法
- 因你的UITextField仅接受数字输入,无需额外处理非数字字符
内容的提问来源于stack exchange,提问作者Daniel98
相关产品推荐
相关产品推荐

