Swift 5中如何限制UITextField仅输入指定格式内容?
Swift UITextField 严格输入规则实现方案
原代码存在的问题
- 仅判断字符是否在允许集合内,未限制输入顺序,用户可随意输入允许字符(比如先输入
y再输入Q),不符合“必须按顺序输入”的要求 - 在
shouldChangeCharactersIn回调中直接修改textField.text,会干扰系统的文本替换逻辑,导致输入流程混乱 - 允许输入空格和无限制的连字符,不符合最终格式要求
- 未限制文本总长度,用户可输入超出
Qwerty-12345的内容
可行实现代码
func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool { guard let currentText = textField.text as NSString? else { return false } let newText = currentText.replacingCharacters(in: range, with: string) // 定义目标格式的固定部分 let targetPrefix = "Qwerty" let targetSuffix = "12345" let fullTargetText = "\(targetPrefix)-\(targetSuffix)" // 禁止输入超过最终目标长度的内容 guard newText.count <= fullTargetText.count else { return false } // 分阶段处理输入逻辑 switch newText.count { case 0...targetPrefix.count: // 阶段1:输入前缀部分,必须严格匹配"Qwerty"的顺序 return targetPrefix.hasPrefix(newText) case targetPrefix.count + 1: // 阶段2:刚输入完前缀,自动补全连字符 if newText == targetPrefix { textField.text = "\(targetPrefix)-" return false } // 若用户直接输入连字符(比如前缀没输完就加-),直接禁止 return newText == "\(targetPrefix)-" default: // 阶段3:输入后缀数字部分,必须严格匹配"12345"的顺序 guard newText.hasPrefix("\(targetPrefix)-") else { return false } let suffixInput = newText.dropFirst(targetPrefix.count + 1) return targetSuffix.hasPrefix(String(suffixInput)) } }
代码逻辑说明
- 计算新文本:通过
NSString的replacingCharacters方法准确获取替换后的文本,避免直接修改textField.text导致的逻辑冲突 - 长度限制:提前判断新文本长度是否超过最终目标长度
Qwerty-12345(共12个字符),超过则直接禁止 - 分阶段校验:
- 前缀阶段:仅允许输入与
Qwerty完全匹配的前缀内容,确保输入顺序严格一致 - 连字符补全:当用户刚好输入完
Qwerty时,自动补全连字符-,并返回false终止系统默认的文本替换 - 后缀阶段:仅允许输入与
12345完全匹配的前缀内容,确保数字输入顺序严格一致
- 前缀阶段:仅允许输入与
- 支持删除操作:用户可删除错误输入重新开始,删除后会自动回到对应阶段的校验逻辑
内容的提问来源于stack exchange,提问作者Gucci
相关产品推荐
相关产品推荐

