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

如何让UITextField的@objc输入过滤函数在用户输入时触发?

解决UITextField输入格式化函数不生效的问题

要让你的billVerification函数在用户输入时生效,需要完成两个关键步骤:给TextField绑定输入监听事件,同时修复函数内的赋值逻辑并完善验证规则。

步骤1:绑定TextField的输入监听

在createTextField方法中添加事件绑定代码,让用户每输入/删除字符时触发验证函数:

private func createTextField() {
    // ... 原有样式、约束代码保持不变
    
    // 添加这行:监听编辑变化事件
    textField.addTarget(self, action: #selector(billVerification(input:)), for: .editingChanged)
    
    textField.translatesAutoresizingMaskIntoConstraints = false
    // ... 约束激活代码保持不变
}

步骤2:修复并完善验证函数

原函数仅计算了格式化后的字符串,但未将结果赋值回TextField,导致修改不生效。同时补充边界情况处理,避免无效输入:

@objc func billVerification(input: UITextField) {
    guard var inputText = input.text else { return }
    
    // 只保留数字和小数点
    var filteredText = inputText.filter { "0123456789.".contains($0) }
    
    // 处理多个小数点:仅保留第一个
    let dotCount = filteredText.filter { $0 == "." }.count
    if dotCount > 1 {
        if let firstDotIndex = filteredText.firstIndex(of: ".") {
            let beforeDot = filteredText[...firstDotIndex]
            let afterDot = filteredText[firstDotIndex...].filter { $0 != "." }
            filteredText = String(beforeDot + afterDot)
        }
    }
    
    // 限制小数点后最多两位
    if filteredText.contains(".") {
        let parts = filteredText.components(separatedBy: ".")
        if parts.count == 2, parts[1].count > 2 {
            filteredText = "\(parts[0]).\(parts[1].prefix(2))"
        }
    }
    
    // 处理开头为小数点的情况:自动补0(可选,按需调整)
    if filteredText.starts(with: ".") {
        filteredText = "0" + filteredText
    }
    
    // 将格式化后的内容赋值回TextField
    input.text = filteredText
}

核心说明

  • .editingChanged事件会在用户每次输入操作时触发,实现实时格式化效果。
  • 补充的边界处理是为了避免不符合要求的输入场景,你可以根据实际需求删减或调整这些规则。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 03:45:41