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

Swift开发EggTimer煮蛋计时器运行持续输出Error如何解决

故障根因
  • 核心匹配逻辑错误:update方法内switch的判断对象为全新初始化的UILabel()实例,和你绑定的三个IBOutlet倒计时标签无任何关联,永远无法命中对应case,所以始终触发default分支打印Error
  • 定时器配置错误:创建Timer时指定的Selector是UIMenuController.update,而非当前ViewController自定义的update方法;同时Timer被定义为viewDidLoad内的局部变量,方法执行结束后会被自动释放,无法持续触发回调
  • 业务逻辑脱节:按钮点击事件未和倒计时逻辑关联,无法实现「点击对应熟度按钮启动对应时长倒计时」的需求
修复后完整代码
class ViewController: UIViewController {
    
    let eggTimes = ["Soft": 5, "Medium": 7, "Hard" : 12]
    // 全局持有定时器,避免被自动释放
    var timer: Timer?
    // 存储当前选中的倒计时剩余时长
    var remainingTime = 0

    @IBOutlet weak var countdownLabel: UILabel!
    
    override func viewDidLoad() {
        super.viewDidLoad()
    }

    @objc func update() {
        if remainingTime > 0 {
            print("\(remainingTime) 秒后鸡蛋煮好")
            countdownLabel.text = "剩余:\(remainingTime) 秒"
            remainingTime -= 1
        } else {
            // 倒计时结束自动停止定时器
            timer?.invalidate()
            countdownLabel.text = "煮好啦!"
            print("鸡蛋已达到设定熟度")
        }
    }
    
    @IBAction func hardnessSelected(_ sender: UIButton) {
        // 先停止之前运行的定时器,避免多定时器冲突
        timer?.invalidate()
        let hardness = sender.currentTitle!
        // 取出对应熟度的倒计时总时长
        remainingTime = eggTimes[hardness]!
        // 启动新的定时器,每秒触发一次回调
        timer = Timer.scheduledTimer(timeInterval: 1, target: self, selector: #selector(update), userInfo: nil, repeats: true)
        // 立即刷新UI显示
        update()
    }
}
调整说明
  • 简化计数逻辑,仅用一个remainingTime变量存储剩余倒计时时长,无需维护三个独立计数变量
  • 点击熟度按钮时先清空正在运行的定时器,再启动对应时长的倒计时,避免逻辑冲突
  • 定时器时间间隔调整为1秒,符合倒计时的常规使用习惯
  • 倒计时结束后自动停止定时器,同步更新UI提示
原界面截图

main.storyboard界面截图

内容的提问来源于stack exchange,提问作者knowrohit.07

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 11:30:03