2017-08-15 2 views
0

Je souhaite créer une minuterie déclenchée par un bouton pour démarrer la minuterie. Lorsque la minuterie est en cours d'exécution, je veux que le même bouton mette la minuterie en pause.La minuterie ne démarre pas avec le bouton de bascule de démarrage/pause

Je gère ce comportement principalement dans le IBAction de l'étiquette du bouton:

@IBAction func btn_start(_ sender: Any) {   
    if timerIsRunning == false {   
     timer = Timer.scheduledTimer(timeInterval: 1, target: self, selector: #selector(runTimer), userInfo: nil, repeats: true)    
     timerIsRunning = true      
    } 

    if timerIsRunning == true {    
     timer.invalidate()    
     timerIsRunning = false    
    }   
} 

Je reconnais que je peux déclencher le bouton de démarrage plusieurs fois et la minuterie a été déclenchée aussi fois severalt, de sorte que la minuterie accélérait à la fin. Pour éviter ce comportement, j'introduit le timerIsRunning: Bool avec le résultat inattendu, que la minuterie ne démarre pas plus: -/

Ceci est ma fonction de minuterie qui est déclenchée par la minuterie:

func runTimer() {   
    if timeInSeconds >= 0 {   
     timeInSeconds = timeInSeconds - 1    
     updateTimerLabel()    
    }   
} 

Can quelqu'un explique cela? et donnez-moi un coup de main?

+0

'timerIsRunning = true; si timerIsRunning == true' Uh-huh. – matt

+0

@matt Que voulez-vous dire? Peux-tu expliquer? – boehmatron

+0

il veut dire ce que j'ai essentiellement écrit dans ma réponse, vous définissez la variable sur 'true' et dans la déclaration suivante vous vérifiez sa valeur par rapport à true. – luk2302

Répondre

3

Vous devriez return après avoir démarré la minuterie, ou utiliser else. Sinon, vous avez toujours invalidate la minuterie nouvellement créé instantanément dans le deuxième bloc if dans votre méthode:

@IBAction func btn_start(_ sender: Any) {   
    if !timerIsRunning {   
     timer = Timer.scheduledTimer(timeInterval: 1, target: self, selector: #selector(runTimer), userInfo: nil, repeats: true)    
     timerIsRunning = true      
    } else {    
     timer.invalidate()    
     timerIsRunning = false    
    }   
}