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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.30 11:45:02