Question Comment arrêter NSTimer.scheduledTimerWithTimeInterval


Comment puis-je Arrêtez ma minuterie 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

Cela a fonctionné. Quelque chose était buggy avec mon projet! Corrigé en supprimant le bouton et en les rajoutant. On dirait que j'avais un doublon ou quelque chose.


39
2018-04-20 09:26


origine


Réponses:


Vous n'avez pas à utiliser Selector:

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

De plus, le minuteur se transmet à 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 temporisateur est une variable d’instance:

myTimer.invalidate()
myTimer = nil

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

Capture d'écran pour afficher le temporisateur invalidé et mis à zéro.

screenshot

Mise à jour pour Swift 2.2+

Voir https://stackoverflow.com/a/36160191/2227743 pour le nouveau #selector remplacement de la syntaxe Selector().


76
2018-04-20 09:34



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
2018-04-20 09:33



Comme avant Swift 2.2

let printTimer = NSTimer.scheduledTimerWithTimeInterval(2.0, target: self, selector: #selector(printDescription), userInfo: nil, repeats: true)

func printDescription() {
    print("Print timer will print every after 2.0 seconds")
}

La minuterie d'impression s'imprimera toutes les 2 secondes après


-3
2018-04-28 06:55