Swift开发:点击事件中设置的counter变量神秘归零问题求助
Swift计时器应用问题修复
核心问题
你在startClicked方法的if let counter = Int(secondsText.text)这行代码里,创建了一个局部变量counter,它和类顶部声明的全局counter是完全独立的两个变量。你只是给这个局部变量赋了值,但全局的counter仍然保持初始值0。当退出startClicked函数后,局部变量被销毁,timerFunction访问的是全局的counter,所以会显示0。
修复步骤
- 修正变量赋值逻辑:把局部变量改成给全局
counter赋值,避免变量名冲突 - 修复语法逻辑错误:
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
相关产品推荐
相关产品推荐

