Swift:使用Timer实现输入防抖时如何传递参数?
用Timer实现TextField输入防抖并传参
核心思路是通过实例变量暂存最新输入值,并在每次输入时重置Timer,确保只有停止输入2秒后才会执行保存操作:
- 定义两个实例变量:
- 用于管理防抖的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)") // 这里替换成你的保存逻辑 } }
- 可选传参方式(用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
相关产品推荐
相关产品推荐

