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

Swift:实现粘贴验证码后自动切换TextField的问题

解决验证码TextField粘贴自动填充问题

这个问题很典型:手动输入时光标切换的逻辑正常,但一次性粘贴多字符时,因为editingChanged事件只会触发一次,导致所有文本都堆在第一个TextField里,不会自动分配到后续输入框。咱们来修改代码,让粘贴操作也能自动拆分填充验证码:

第一步:修改textFieldDidChange方法,处理文本溢出与传递

替换你原来的textFieldDidChange方法,新增文本拆分和自动传递的逻辑:

@objc func textFieldDidChange(_ textField: UITextField) {
    guard var currentText = textField.text else { return }
    
    // 处理文本溢出:如果当前输入框文本超过4个字符,拆分出多余部分
    if currentText.count > 4 {
        let overflowText = String(currentText.suffix(currentText.count - 4))
        currentText = String(currentText.prefix(4))
        textField.text = currentText
        
        // 将溢出文本传递到下一个输入框,并触发其编辑事件继续处理
        switch textField {
        case token1:
            token2?.text = overflowText
            token2?.sendActions(for: .editingChanged)
        case token2:
            token3.text = overflowText
            token3.sendActions(for: .editingChanged)
        case token3:
            // 第三个输入框无后续,直接截断溢出部分
            break
        default:
            break
        }
    }
    
    // 原有光标切换逻辑,优化为仅当刚好填满4个字符时切换
    switch textField {
    case token1 where currentText.count == 4:
        token2?.becomeFirstResponder()
    case token2 where currentText.count == 4:
        token3.becomeFirstResponder()
    case token3 where currentText.count == 4:
        token3.resignFirstResponder()
    default:
        break
    }
}

第二步:添加输入长度限制(可选但推荐)

为了彻底避免单个输入框出现超过4个字符的情况,咱们可以通过UITextFieldDelegate限制每个输入框的最大长度:

  1. 先让你的ViewController遵循UITextFieldDelegate协议:
class TokenViewController: UIViewController, UITextFieldDelegate {
    // ... 你的现有代码 ...
}
  1. 在viewDidLoad中给三个TextField设置代理:
override func viewDidLoad() { 
    super.viewDidLoad() 
    getCode() 
    token1?.addTarget(self, action: #selector(textFieldDidChange(_:)), for: .editingChanged) 
    token2?.addTarget(self, action: #selector(textFieldDidChange(_:)), for: .editingChanged) 
    token3?.addTarget(self, action: #selector(textFieldDidChange(_:)), for: .editingChanged) 
    
    // 设置代理
    token1?.delegate = self
    token2?.delegate = self
    token3?.delegate = self
}
  1. 实现长度限制的代理方法:
func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
    guard let currentText = textField.text else { return true }
    let newLength = currentText.count + string.count - range.length
    return newLength <= 4
}

逻辑说明

  • 当粘贴多字符到第一个TextField时,textFieldDidChange会先截断前4个字符保留,把剩下的文本传递给第二个TextField,同时触发第二个TextField的editingChanged事件,让它继续处理自己的文本溢出(如果有的话),以此类推。
  • 长度限制代理方法能确保无论是手动输入还是粘贴,单个输入框都不会超过4个字符,让整个流程更严谨。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 06:30:44