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

Swift:使用Timer实现输入防抖时如何传递参数?

用Timer实现TextField输入防抖并传参

核心思路是通过实例变量暂存最新输入值,并在每次输入时重置Timer,确保只有停止输入2秒后才会执行保存操作:

  1. 定义两个实例变量:
    • 用于管理防抖的Timer对象
    • 用于暂存最新输入文本的字符串变量
class ViewController: UIViewController {
    // 防抖定时器
    private var debounceTimer: Timer?
    // 暂存最新输入的文本
    private var currentInputText = ""
    
    // 关联TextField的editingChanged事件
    @IBAction func inputTextChanged(_ sender: UITextField) {
        // 每次输入先取消之前的定时器,避免触发中间输入的保存操作
        debounceTimer?.invalidate()
        
        // 更新暂存的最新输入值
        currentInputText = sender.text ?? ""
        
        // 创建新定时器,延迟2秒执行保存逻辑
        debounceTimer = Timer.scheduledTimer(
            timeInterval: 2.0,
            target: self,
            selector: #selector(doSomething),
            userInfo: nil,
            repeats: false
        )
    }
    
    @objc private func doSomething() {
        // 直接使用暂存的最新文本执行保存
        print("保存输入值:\(currentInputText)")
        // 这里替换成你的保存逻辑
    }
}
  1. 可选传参方式(用Timer的userInfo):
    如果不想用实例变量,也可以在创建Timer时直接把当前文本传入userInfo:
@IBAction func inputTextChanged(_ sender: UITextField) {
    debounceTimer?.invalidate()
    
    debounceTimer = Timer.scheduledTimer(
        timeInterval: 2.0,
        target: self,
        selector: #selector(doSomethingWithParam(_:)),
        userInfo: sender.text ?? "",
        repeats: false
    )
}

@objc private func doSomethingWithParam(_ timer: Timer) {
    if let inputText = timer.userInfo as? String {
        print("保存输入值:\(inputText)")
        // 执行保存逻辑
    }
}

关键注意点:每次输入必须先调用debounceTimer?.invalidate(),否则之前创建的定时器会继续触发,导致保存每个输入的字符。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 10:51:07