如何不使用UITextField delegate实现禁止首位输入0的功能?
UITextField 禁止首位输入0实现方案(非代理方式)
实现步骤
- 给目标UITextField绑定
editingChanged事件的自定义处理方法
在需要使用的ViewController中添加绑定代码,一般放在viewDidLoad生命周期内:
// yourTextField替换为你的UITextField实例对象 yourTextField.addTarget(self, action: #selector(textFieldDidChange(_:)), for: .editingChanged)
- 实现自定义文本变更处理方法
@objc private func textFieldDidChange(_ textField: UITextField) { guard let currentText = textField.text, !currentText.isEmpty else { return } // 判断首位是否为0 if currentText.first == "0" { // 移除首位的0,更新文本 textField.text = String(currentText.dropFirst()) // 若业务允许输入单个0,可增加如下判断: // guard currentText.count > 1 else { return } // textField.text = String(currentText.dropFirst()) } }
优化方案(多场景复用)
如果需要给多个UITextField添加该规则,可通过扩展UITextField封装逻辑,减少重复代码:
extension UITextField { /// 开启禁止首位为0的规则 func setupDisableLeadingZeroRule() { addTarget(self, action: #selector(handleLeadingZeroCheck), for: .editingChanged) } @objc private func handleLeadingZeroCheck() { guard let currentText = text, !currentText.isEmpty else { return } if currentText.first == "0" { guard currentText.count > 1 else { // 允许输入单个0时保留该行,不需要则删除该行直接执行text赋值 return } text = String(currentText.dropFirst()) } } }
使用时直接调用对应方法即可:
yourTextField.setupDisableLeadingZeroRule()
说明
- 该方案覆盖所有文本修改场景:包括键盘输入、粘贴、剪切操作,比原代理方案的适配范围更全面
- 可根据业务需求调整是否允许输入单个0,修改对应注释位置的代码即可
内容的提问来源于stack exchange,提问作者Venkatesh Chejarla
相关产品推荐
相关产品推荐

