You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 08:02:41