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
相关产品推荐
相关产品推荐

