Swift5 实现UITextField掩码 支持XXXX分块格式与真实内容切换
每4位分块格式UITextField功能实现方案
核心缺失功能落地
1. 原始纯数字数据存储
- 单独维护和展示文本完全解耦的纯数字存储属性,和UI展示逻辑完全分离,避免格式符号干扰业务取值。可在对应控制器/视图类中声明属性:
private var pureNumberValue: String = "" - 文本变更同步规则:只要文本框的展示内容发生变化(输入、删除、按钮切换显示状态),第一时间移除展示文本中所有空格字符,将剩余的纯数字内容赋值给上述存储属性,后续所有业务交互(提交接口、数据回显)全部读取该存储属性,不直接从
textField.text取值。 - 修正现有代码的逻辑漏洞:当前代理方法中手动为textField赋值后,未触发存储值同步,容易出现展示格式和实际存储值不一致的问题,需在赋值完成后立即更新
pureNumberValue。
2. 默认掩码展示与显示按钮交互
- 统一使用通用格式化方法处理所有展示场景,避免输入时、按钮切换时逻辑不一致:
/// 纯数字转换为分块展示文本 /// - Parameters: /// - pureNumber: 原始存储的纯数字 /// - isMasked: 是否展示掩码 func getFormattedDisplayText(from pureNumber: String, isMasked: Bool) -> String { // 仅保留数字、截断到最长12位 let validDigits = String(pureNumber.filter { $0.isNumber }.prefix(12)) // 掩码模式下全部替换为*字符 let displayContent = isMasked ? String(repeating: "*", count: validDigits.count) : validDigits // 每4位插入空格分隔 var result = "" for (index, char) in displayContent.enumerated() { if index > 0, index % 4 == 0 { result += " " } result.append(char) } return result } - 按钮交互逻辑:
- 默认隐藏状态(掩码模式):调用上述方法,传入
isMasked: true,展示**** **** ****的掩码效果 - 点击「显示」按钮后:调用上述方法,传入
isMasked: false,展示带分块空格的真实内容,如1234 5678 9123
- 默认隐藏状态(掩码模式):调用上述方法,传入
现有输入代理逻辑优化
- 替换现有零散的空格插入、退格判断逻辑,统一在用户编辑完成后,先提取当前输入内容中的纯数字,调用通用格式化方法重新为textField赋值,从根源避免空格位置判断错误(如退格到分隔符位置时的逻辑错乱、粘贴文本时格式不对的问题)。
- 输入限制规则调整:
- 禁止输入非数字字符、禁止直接输入空格
- 纯数字最大长度限制为12位,替代原有的range.location长度判断逻辑,适配光标在不同位置编辑、选中部分文本替换的场景。
- 退格逻辑适配:当光标位置在分隔空格前时,通过重新格式化纯数字的逻辑自动适配退格行为,无需硬编码判断range.location是否为5、10的位置。
内容的提问来源于stack exchange,提问作者Eminem
相关产品推荐
相关产品推荐

