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

Swift开发:点击事件中设置的counter变量神秘归零问题求助

Swift计时器应用问题修复

核心问题

你在startClicked方法的if let counter = Int(secondsText.text)这行代码里,创建了一个局部变量counter,它和类顶部声明的全局counter是完全独立的两个变量。你只是给这个局部变量赋了值,但全局的counter仍然保持初始值0。当退出startClicked函数后,局部变量被销毁,timerFunction访问的是全局的counter,所以会显示0。

修复步骤

  1. 修正变量赋值逻辑:把局部变量改成给全局counter赋值,避免变量名冲突
  2. 修复语法逻辑错误:timerFunction里的else分支缺少大括号,导致部分代码不受条件控制

修正后的完整代码

class ViewController: UIViewController {
    var counter = 0
    var timer = Timer()

    @IBOutlet weak var labelText: UILabel!
    @IBOutlet weak var secondsText: UITextField!


   @objc func timerFunction() {
      print("timerFunction: \(counter)")
      if counter == 0 {
          timer.invalidate()
          labelText.text = "Timer Complete"
      } else {
          counter -= 1
          print("timerFunction: \(counter)")
          labelText.text = "Time: \(counter)"
      }
   }

   @IBAction func startClicked(_ sender: Any) {
      if let inputCounter = Int(secondsText.text ?? "") {
          // 将输入的值赋给全局counter
          self.counter = inputCounter
          print("Timer = \(self.counter)")
          labelText.text = "Time: \(self.counter)"
          print("startClicked.Timer 1: \(self.counter)")
          // 先销毁之前的计时器,避免重复创建
          timer.invalidate()
          timer = Timer.scheduledTimer(timeInterval: 1, target: self, selector: #selector(timerFunction), userInfo: nil, repeats: true)

          print("startClicked.Timer 2: \(self.counter)")

      } else {
           print("Invalid timer value")
           labelText.text = "Time: \(counter)"
      }
      print("startClicked.Timer 3: \(counter)")
   }
}

额外优化说明

  • 给secondsText.text加了?? "",避免文本框为空时触发可选值错误
  • 在创建新计时器前调用timer.invalidate(),防止用户多次点击start按钮创建多个计时器,导致计时速度异常

内容的提问来源于stack exchange,提问作者Daniel Sanborn

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 03:45:47