如何使多次启​​动的NSTimer失效

我在Swift做了一个实践项目来学习NSTimer如何工作。 有一个button启动计时器和一个button来使其失效。 当我点击每个button一次,它工作正常。 但是,当我多次点击启动定时器button时,我不再能使其无效。

在这里输入图像说明

这是我的代码:

 class ViewController: UIViewController { var counter = 0 var timer = NSTimer() @IBOutlet weak var label: UILabel! @IBAction func startTimerButtonTapped(sender: UIButton) { timer = NSTimer.scheduledTimerWithTimeInterval(0.4, target: self, selector: "update", userInfo: nil, repeats: true) } @IBAction func cancelTimerButtonTapped(sender: UIButton) { timer.invalidate() } func update() { ++counter label.text = "\(counter)" } } 

我已经看到了这些问题,但是我无法从他们那里收集到我的问题的答案(很多是旧的Obj-C pre-ARC日子,其他的都是不同的问题):

  • NSTimer() – timer.invalidate不工作在一个简单的秒表?
  • 在Swift中使用NSTimer
  • NSTimer不停止
  • 无法使NSTimer无效(停止)
  • NSTimer不会因无效而停止
  • 不能无效,停止倒计时NSTimer – Objective C
  • IOS:停止NSTimer

如果要在每次点击“开始”button时重置计时器,则可以在startTimerButtonTapped启动新的计时器之前添加timer.invalidate()

 @IBAction func startTimerButtonTapped(sender: UIButton) { timer.invalidate() timer = NSTimer.scheduledTimerWithTimeInterval(0.4, target: self, selector: "update", userInfo: nil, repeats: true) } 

我正在更新一个解释,但@jcaron已经在评论中,所以我只是引用他的文字,不需要改变它:

每次点击“开始计时器”button,您将创build一个新的计时器,同时保留前一个计时器,但不参考它(因为您已经用刚刚创build的新计时器覆盖了timer )。 在创build新的之前,您需要先使其无效。

我想build议你按下取消button时,设置计时器为零。 并且不要忘记设置计数器= 0使计时器无效。