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

