Swift开发:多次点击启动按钮致倒计时加速,如何规避该问题?
嘿,这个问题我太熟了!每次点按钮都新建一个Timer,多个Timer同时触发processTime方法,可不就把倒计时速度翻倍了嘛~给你几个实用的解决思路,按需选就行:
方法1:点击后禁用按钮,倒计时结束再恢复
这个方法最直观,用户点击一次后按钮就不能再点,从根源上避免重复触发。你之前尝试过禁用按钮,但可能没处理倒计时结束后恢复按钮的逻辑,补全后就完美了:
// 先确保你的类里timer是可选类型:var timer: Timer? @IBAction func startButton(_ sender: Any) { // 把sender转成UIButton并禁用 guard let startBtn = sender as? UIButton else { return } startBtn.isEnabled = false // 先销毁之前可能存在的Timer,防止漏网之鱼 timer?.invalidate() // 把按钮存到Timer的userInfo里,方便后续恢复 timer = Timer.scheduledTimer(timeInterval: 1, target: self, selector: #selector(processTime), userInfo: startBtn, repeats: true) } @objc func processTime(_ timer: Timer){ if counter > 0 { counter -= 1 timeLabel.text = "\(counter)" }else { timer.invalidate() // 从userInfo取出按钮,恢复可用状态 if let startBtn = timer.userInfo as? UIButton { startBtn.isEnabled = true } } }
方法2:每次创建新Timer前销毁旧的
如果想允许用户点击按钮重置倒计时(比如中途想重新开始),这个方法更合适。不管用户点多少次,始终只会有一个Timer在运行:
@IBAction func startButton(_ sender: Any) { // 先停掉之前的Timer timer?.invalidate() // 可选:重置倒计时数值,比如回到初始值60 counter = 60 timeLabel.text = "\(counter)" // 创建新的Timer timer = Timer.scheduledTimer(timeInterval: 1, target: self, selector: #selector(processTime), userInfo: nil, repeats: true) } @objc func processTime(){ if counter > 0 { counter -= 1 timeLabel.text = "\(counter)" }else { timer.invalidate() } }
方法3:用标志位判断是否正在倒计时
加一个布尔变量记录当前是否在倒计时,点击按钮时先检查状态,已经在倒计时就直接返回:
// 在类里新增一个标志位 var isCounting = false @IBAction func startButton(_ sender: Any) { // 如果正在倒计时,直接返回,不创建新Timer guard !isCounting else { return } isCounting = true timer?.invalidate() timer = Timer.scheduledTimer(timeInterval: 1, target: self, selector: #selector(processTime), userInfo: nil, repeats: true) } @objc func processTime(){ if counter > 0 { counter -= 1 timeLabel.text = "\(counter)" }else { timer.invalidate() // 倒计时结束,重置标志位 isCounting = false } }
个人推荐把方法1和方法2结合起来用,既防止重复点击,又能在需要的时候重置倒计时,体验会更好~
内容的提问来源于stack exchange,提问作者Mohamed Farid
相关产品推荐
相关产品推荐

