How to reset NSTimer? swift code

17,117

So I finally figured it out...

I had to make a separate function to start the timer by initializing it. And in the resetTimer() function I added the timer.invalidate() line. So my code looks like this:

func loadPicture() {
    //check if repeat picture
    secondInt = randomInt
    randomInt = Int(arc4random_uniform(24))
    if secondInt != randomInt {
        pictureName = String(self.PicList[randomInt])
        image = UIImage(named: pictureName)
        self.picture.image = image
        resetTimer()

    }
    else{
        loadPicture()
    }
}
func startTimer(){
    timer = NSTimer.scheduledTimerWithTimeInterval(1.0, target: self, selector: Selector("gameOverTimer"), userInfo: "timer", repeats: true)
}

func resetTimer(){

    timer.invalidate()
    startTimer()
}

EDIT

With the new selector syntax it looks like this:

func startTimer(){
    timer = NSTimer.scheduledTimerWithTimeInterval(1.0, target: self, selector: #selector(NameOfClass.startTimer), userInfo: "timer", repeats: true)
}
Share:
17,117
LuKenneth
Author by

LuKenneth

Updated on July 24, 2022

Comments

  • LuKenneth
    LuKenneth almost 2 years

    So I'm creating an app/game where you tap a button corresponding to a picture before the timer runs out and you lose. You get 1 second to tap the button, and if you choose the right button then the timer resets and a new picture comes up. I'm having trouble reseting the timer. It fires after one second even after I attempt to reset it. Here's the code:

    loadPicture() runs off viewDidLoad()

    func loadPicture() {
        //check if repeat picture
        secondInt = randomInt
        randomInt = Int(arc4random_uniform(24))
        if secondInt != randomInt {
            pictureName = String(self.PicList[randomInt])
            image = UIImage(named: pictureName)
            self.picture.image = image
            timer.invalidate()
            resetTimer()
    
        }
        else{
            loadPicture()
        }
    }
    

    and here's the resetTimer() method:

    func resetTimer(){
            timer = NSTimer.scheduledTimerWithTimeInterval(1.0, target: self, selector: Selector("gameOverTimer"), userInfo: nil, repeats: false)
    
    }
    

    I think it may have something to do with NSRunloops? I'm not sure. I don't even know what a NSRunloop is to be honest.

  • Que20
    Que20 over 7 years
    NSTimer.scheduledTimerWithTimeInterval will give me back a new instance of NSTimer, right ? Is there any way to just reset the Timer, like, the same Timer instance ?
  • LuKenneth
    LuKenneth over 7 years
    no, i don't believe so. You can invalidate it, but if you do that you cannot start it back up again. @Que20