web-dev-qa-db-fra.com

Comment arrêter NSTimer.scheduledTimerWithTimeInterval

Comment puis-je arrêter mon chronomètre de courir? Pas comme une pause, mais un arrêt.

import UIKit

class LastManStandingViewController: UIViewController {    

@IBOutlet weak var timeLabel: UILabel!
@IBOutlet weak var timeTextbox: UITextField!
@IBOutlet weak var startButton: UIButton!
@IBOutlet weak var stopButton: UIButton!

var myCounter = 0
var myTimer : NSTimer = NSTimer()

override func viewDidLoad() {
    super.viewDidLoad()
    // Do any additional setup after loading the view, typically from a nib.

    timeLabel.text = String(myCounter)
}

override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
    // Dispose of any resources that can be recreated.
}

func startTimer(){
    myTimer = NSTimer.scheduledTimerWithTimeInterval(1, target: self, selector: Selector("updateTimer"), userInfo: nil, repeats: true)
    println("func startTimer")
}

func stopTimer(){
    myTimer.invalidate()
    myCounter = 0
    timeLabel.text = String(myCounter)
    println("func stopTimer")
}

func updateTimer(){
    timeLabel.text = String(myCounter++)
    println("func updateTimer")
}
@IBAction func startButton(sender: AnyObject) {
    startTimer()
}
@IBAction func stopButton(sender: AnyObject) {
    stopTimer()
}

}

Je peux démarrer le chronomètre, mais lorsque j'appuie sur le bouton Stop, il se réinitialise et recommence à compter. Ça n'arrête pas.

Fait le travail. Quelque chose était buggy avec mon projet! Corrigé en supprimant le bouton et en les rajoutant. On dirait que j'ai eu un duplicata ou quelque chose.

39
Erik Auranaune

Vous n'êtes pas obligé d'utiliser Selector:

@IBAction func startButton(sender: AnyObject) {
    myTimer = NSTimer.scheduledTimerWithTimeInterval(1, target: self, selector: "updateTimer:", userInfo: nil, repeats: true)
}

De plus, le timer passe lui-même à la méthode sélectionnée, vous pouvez donc l'invalider dans la méthode si vous avez besoin de:

func updateTimer(timer: NSTimer) {
    timeLabel.text = String(Counter++)
    timer.invalidate()
}

Ou si le timer est une variable d'instance:

myTimer.invalidate()
myTimer = nil

C'est une bonne chose que nil le minuteur de la variable d'instance après l'avoir invalidé, cela évite toute confusion supplémentaire si vous devez créer un autre minuteur avec la même variable. De plus, les noms de méthodes et les variables doivent commencer par une lettre minuscule.

Capture d'écran pour afficher la minuterie invalidée et définie sur nil.

screenshot

Mise à jour pour Swift 2.2 +

Voir https://stackoverflow.com/a/36160191/222774 pour la nouvelle syntaxe #selector Remplaçant Selector().

77
ayaio

vous pouvez l'utiliser lorsque certaines conditions sont remplies et que vous souhaitez arrêter le chronomètre:

Timer.invalidate()

Voici un exemple simple:

func UpdateTimer(){
    timeLabel.text = String(Counter++)
    if timeLabel.text == String("5") {
        Timer.invalidate()
    }
}

cela arrêtera la minuterie.

Vous pouvez le modifier selon vos besoins.

7
Dharmesh