2015-07-29 12 views
8

Quindi sto creando un'app/gioco in cui si tocca un pulsante corrispondente a un'immagine prima che scada il tempo e si perda. Ottieni 1 secondo per toccare il pulsante, e se scegli il pulsante giusto, il timer si azzera e viene visualizzata una nuova immagine. Ho problemi a resettare il timer. Spara dopo un secondo, anche dopo che ho provato a resettarlo. Ecco il codice:Come resettare NSTimer? codice rapido

LoadPicture() scappa 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() 
    } 
} 

ed ecco il metodo resetTimer():

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

} 

penso che possa avere qualcosa a che fare con NSRunloops? Non ne sono sicuro. Non so nemmeno cosa sia NSRunloop ad essere onesto.

+0

io non sono sicuro perché il timer è sparare dopo aver invalidarla , ma hai un bug nella tua ricorsione che controlla i duplicati - Sovrascrivi 'randomInt' in modo che nella chiamata ricorsiva a' loadPicture' tu stia verificando efficacemente se questo numero casuale è uguale al numero casuale precedente, non se questo casuale il numero è il s come l'immagine precedente che è stata visualizzata – Paulw11

+0

in loadPicture() prima del timer di scrittura della riga resetTimer() = nil. . . – iHart

+0

Per essere sicuri, stai creando il timer nello stesso thread? secondo, hai provato ad aumentare il timeout per dire 5 secondi? – Shripada

risposta

11

Così ho finalmente capito ...

ho dovuto fare una funzione separata per avviare il timer per l'inizializzazione. E nella funzione resetTimer() ho aggiunto la riga timer.invalidate(). Quindi il mio codice è simile al seguente:

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

Con il nuovo selettore di sintassi simile a questa:

func startTimer(){ 
    timer = NSTimer.scheduledTimerWithTimeInterval(1.0, target: self, selector: #selector(NameOfClass.startTimer), userInfo: "timer", repeats: true) 
} 
+0

'NSTimer.scheduledTimerWithTimeInterval' mi restituirà una nuova istanza di NSTimer, giusto? C'è un modo per reimpostare il Timer, ad esempio, la stessa istanza Timer ? – Que20

+0

no, non credo. Puoi invalidarlo, ma se lo fai non puoi riavviarlo di nuovo. @ Que20 –