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提示
原界面截图

内容的提问来源于stack exchange,提问作者knowrohit.07
相关产品推荐
相关产品推荐

