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

Swift: 仅允许字母输入的UITextField无法使用自动填充/剪贴板输入姓名

问题根因

原校验逻辑仅针对单次输入的单个字符做校验,粘贴、键盘自动填充场景下,shouldChangeCharactersIn 代理方法传入的替换字符串是包含空格的整段姓名文本,整段文本中夹杂的空格会被后续的字母字符校验拦截,直接返回false导致填充失败。

修正后代码

func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
    // 生成替换后的完整文本
    let originalText = textField.text ?? ""
    guard let textRange = Range(range, in: originalText) else { return true }
    let finalText = originalText.replacingCharacters(in: textRange, with: string)
    
    // 禁止首尾空格
    if finalText.hasPrefix(" ") || finalText.hasSuffix(" ") {
        return false
    }
    
    // 禁止连续空格
    if finalText.contains("  ") {
        return false
    }
    
    // 仅允许字母和空格两种字符
    let allowedCharset = CharacterSet.letters.union(.init(charactersIn: " "))
    if finalText.rangeOfCharacter(from: allowedCharset.inverted) != nil {
        return false
    }
    
    return true
}

适配说明

  • 校验逻辑从校验单次输入的替换字符串,改为校验替换后的完整文本,天然兼容整段粘贴、键盘自动填充的整段文本输入场景
  • 所有原有规则全部保留:禁止首空格、禁止连续空格、仅允许输入字母和中间单个空格,手动输入场景的表现和原有逻辑完全一致
  • 逻辑合并后无需单独处理空格输入的特殊分支,代码可维护性更高

内容的提问来源于stack exchange,提问作者Master AgentX

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 23:00:01