web-dev-qa-db-fra.com

Comment puis-je suspendre et reprendre NSTimer.scheduledTimerWithTimeInterval dans swift?

Je développe un jeu et je veux créer un menu de pause. Voici mon code: 

self.view?.paused = true

mais NSTimer.scheduledTimerWithTimeInterval fonctionne toujours ..

 for var i=0; i < rocketCount; i++ {
 var a:NSTimeInterval = 1
 ii += a
 delaysShow =   2.0 + ((stimulus + interStimulus) * ii)       
 var time3 = NSTimer.scheduledTimerWithTimeInterval(delaysShow!, target: self, selector: Selector("showRocket:"), userInfo: rocketid[i]  , repeats: false)
 }

Je veux que time3 mette en pause le chronomètre lorsque le joueur clique sur le menu Pause et continue à le lancer lorsque le joueur revient au jeu, mais comment puis-je mettre en pause NSTimer.scheduledTimerWithTimeInterval? aidez-moi s'il vous plaît.

15

Vous devez l'invalider et le recréer. Vous pouvez ensuite utiliser une isPaused bool pour garder la trace de l'état si vous avez le même bouton pour mettre en pause et reprendre le chronomètre:

var isPaused = true
var timer = NSTimer()    
@IBAction func pauseResume(sender: AnyObject) {     
    if isPaused{
        timer = NSTimer.scheduledTimerWithTimeInterval(0.1, target: self, selector: Selector("somAction"), userInfo: nil, repeats: true)
        isPaused = false
    } else {
        timer.invalidate()
        isPaused = true
    }
}
30
jonnie

Pour l'arrêter 

  time3.invalidate() 

Pour recommencer

  time3.fire()

Commencer

timer = Timer.scheduledTimer(timeInterval: 1, target: self, selector: #selector(ViewController.action), userInfo: nil, repeats: true)

Arrêter, mettre en pause

timer.invalidate()

Réinitialiser

time += 1
label.text = String(time)

'label' est la minuterie en sortie.

4
Kay Cee

Commencer: 

timer = NSTimer.scheduledTimerWithTimeInterval(1.0, target: self, selector: Selector("updateView"), userInfo: nil, repeats: true)

Pour reprendre: 

timer = NSTimer.scheduledTimerWithTimeInterval(1.0, target: self, selector: Selector("updateView"), userInfo: nil, repeats: true)

Arrêter, mettre en pause: 

timer.invalidate

Cela a fonctionné pour moi. Le truc est que ne cherchez pas quelque chose comme "timer.resume" ou "timer.validate". Utilisez simplement "le même code pour démarrer une minuterie" pour le reprendre après la pause.

Vous ne pouvez pas reprendre le chronomètre en arrière .. Au lieu de le reprendre, créez simplement un nouveau chronomètre.

class SomeClass : NSObject { // class must be NSObject, if there is no "NSObject" you'll get the error at runtime

    var timer = NSTimer()

    init() {
        super.init()
        startOrResumeTimer()
    }

    func timerAction() {
        NSLog("timer action")
    }

    func pauseTimer() {
        timer.invalidate
    }

    func startOrResumeTimer() {
        timer = NSTimer.scheduledTimerWithTimeInterval(0.5, target: self, selector: Selector("timerAction"), userInfo: nil, repeats: true)
    }
}
3
nickeyzzz

Swift3

Déclaration globale

 var swiftTimer = Timer()
 var count = 30
 var timer = Timer()
 @IBOutlet weak var CountDownTimer: UILabel!

viewDidLoad

override func viewDidLoad() { super.viewDidLoad() BtnStart.tag = 0 }

IBACTION déclenchée

@IBAction func BtnStartTapped(_ sender: Any) {
      if BtnStart.tag == 0 {
           BtnStart.setTitle("STOP", for: .normal)
           timer = Timer.scheduledTimer(timeInterval: 0.1, target: self, selector: #selector(ScoreBoardVC.update), userInfo: nil, repeats: true)

           BtnStart.tag = 1
      }
      else
      {
           BtnStart.setTitle("START", for: .normal)
           timer.invalidate()

           BtnStart.tag = 0
      }


 }

Fonction qui manipule les choses

func update(){

      if(count > 0){
           let minutes = String(count / 60)
           let ConvMin = Float(minutes)
           let minuttes1 = String(format: "%.0f", ConvMin!)

           print(minutes)
           let seconds = String(count % 60)
           let ConvSec = Float(seconds)
           let seconds1 = String(format: "%.0f", ConvSec!)



           CountDownTimer.text = (minuttes1 + ":" + seconds1)
           count += 1
      }

 }
2

Pause minuterie: timer.invalidate ()

et

Reprendre le minuteur: recréez le minuteur. ça marche bien.

timer = Timer.scheduledTimer(timeInterval: 1, target: self, selector: #selector(mainController.updateTimer), userInfo: nil, repeats: true)
0
Chetan Lodhi