Как аннулировать NSTimer, который был запущен несколько раз
Я сделал практический проект в Свифт, чтобы узнать, как работает 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)"
}
}
Я видел эти вопросы, но мне не удалось получить ответ на мой вопрос (многие из них - старые Obj-C
pre-ARC
дни, а другие - разные проблемы):
Ответы
Ответ 1
Вы можете добавить timer.invalidate()
, прежде чем запускать новый таймер в startTimerButtonTapped
, если вы хотите reset таймер при каждом нажатии кнопки "Пуск":
@IBAction func startTimerButtonTapped(sender: UIButton) {
timer.invalidate()
timer = NSTimer.scheduledTimerWithTimeInterval(0.4, target: self, selector: "update", userInfo: nil, repeats: true)
}
Я собирался обновить с объяснением, но @jcaron уже сделал это в комментарии, поэтому я просто цитирую его текст, не нужно его менять:
Каждый раз, когда вы нажимаете кнопку "Start Timer", вы создаете новый таймер, оставляя предыдущий, но не ссылаясь на него (поскольку вы перезаписали timer
с помощью нового таймера, который вы только что создали). Перед созданием нового необходимо аннулировать предыдущий.
Ответ 2
Я хотел бы предложить вам установить таймер на ноль, когда нажимают кнопку отмены.
И не забудьте установить counter = 0
При аннулировании таймера.