Swift iOS煮蛋计时器点击按钮后始终从20开始倒计时问题排查
问题分析
代码的核心错误是变量作用域遮蔽,导致选中的煮蛋时长没有赋值给定时器实际读取的变量:
- 你在类顶部声明的
var secondsRemaining = 20是类的成员属性,定时器触发的timerAction方法读写的都是这个属性 - 在按钮点击回调
hardnessSelected中,你写了var secondsRemaining = eggTimes[hardness]!,这行代码用var在方法内部声明了一个和类属性同名的局部变量,从字典里取出的时长只存在于这个临时局部变量里,方法执行完就会被销毁,根本没有修改类顶部的secondsRemaining属性 - 所以定时器启动后,
timerAction读到的永远是类属性初始化的20,倒计时自然始终从20开始。
修复方案
- 删掉
hardnessSelected方法里给秒数赋值那行的var关键字,直接给类的成员属性赋值,不要新建局部变量 - 启动新计时器前先销毁旧计时器,避免多次点击按钮导致多个计时器同时运行,倒计时速度异常
修复后的按钮点击方法代码如下:
@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
相关产品推荐
相关产品推荐

