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

Sur*_*gch 0 nstimer ios swift

我在Swift做了一个练习项目来学习如何NSTimer工作.启动计时器有一个按钮,一个按钮使计时器无效.当我点击每个按钮一次时,它工作正常.但是,当我多次点击开始计时器按钮时,我无法再使其无效.

在此输入图像描述

这是我的代码:

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)"
    }
}
Run Code Online (Sandbox Code Playgroud)

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

aya*_*aio 5

如果要在每次点击"开始"按钮时重置timer.invalidate()计时器,可以在开始新计时器之前添加startTimerButtonTapped:

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

我打算用解释进行更新,但是@jcaron已经在评论中做了,所以我只是引用他的文字,不需要改变它:

每次点击"开始计时器"按钮,你都会创建一个新的计时器,同时让前一个计时器继续运行,但没有引用它(因为你已经timer用你刚创建的新计时器覆盖了).在创建新的之前,您需要使前一个无效.

  • @Suragch,每次点击“开始计时器”按钮时,您都会创建一个新计时器,同时让前一个计时器继续运行,但没有引用它(因为您已经用刚刚创建的新计时器覆盖了 `timer` )。在创建新的之前,您需要使前一个无效。 (2认同)