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

Swift iOS煮蛋计时器点击按钮后始终从20开始倒计时问题排查

问题分析

代码的核心错误是变量作用域遮蔽,导致选中的煮蛋时长没有赋值给定时器实际读取的变量:

  • 你在类顶部声明的var secondsRemaining = 20是类的成员属性,定时器触发的timerAction方法读写的都是这个属性
  • 在按钮点击回调hardnessSelected中,你写了var secondsRemaining = eggTimes[hardness]!,这行代码用var在方法内部声明了一个和类属性同名的局部变量,从字典里取出的时长只存在于这个临时局部变量里,方法执行完就会被销毁,根本没有修改类顶部的secondsRemaining属性
  • 所以定时器启动后,timerAction读到的永远是类属性初始化的20,倒计时自然始终从20开始。
修复方案
  1. 删掉hardnessSelected方法里给秒数赋值那行的var关键字,直接给类的成员属性赋值,不要新建局部变量
  2. 启动新计时器前先销毁旧计时器,避免多次点击按钮导致多个计时器同时运行,倒计时速度异常

修复后的按钮点击方法代码如下:

@IBAction func hardnessSelected(_ sender: UIButton) {
    // 停止已在运行的旧计时器
    timer.invalidate()
    let hardness = sender.currentTitle!
    // 直接给类属性赋值,不声明新的局部变量
    secondsRemaining = eggTimes[hardness]!
    timer = Timer.scheduledTimer(timeInterval: 1, target: self, selector: #selector(timerAction), userInfo: nil, repeats: true)
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 14:06:23