2015-07-29 6 views
8

Also erstelle ich eine App/ein Spiel, wo du einen Knopf tippst, der einem Bild entspricht, bevor der Timer abgelaufen ist und du verlierst. Sie erhalten 1 Sekunde, um auf den Knopf zu tippen, und wenn Sie den richtigen Knopf wählen, wird der Timer zurückgesetzt und ein neues Bild erscheint. Ich habe Probleme beim Zurücksetzen des Timers. Es wird nach einer Sekunde ausgelöst, auch nachdem ich versucht habe, es zurückzusetzen. Hier ist der Code:Wie NSTimer zurücksetzen? swift code

Loadpicture() wegläuft 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() 
    } 
} 

und hier ist der resetTimer() -Methode:

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

} 

Ich denke, es kann etwas mit NSRunloops zu tun? Ich bin mir nicht sicher. Ich weiß nicht einmal, was ein NSRunloop ist, um ehrlich zu sein.

+0

Ich bin nicht sicher, warum Ihre Timer feuert, nachdem Sie es ungültig , aber Sie haben einen Fehler in Ihrer Rekursion, der nach Duplikaten sucht - Sie überschreiben 'randomInt', so dass Sie beim rekursiven Aufruf von' loadPicture 'effektiv prüfen, ob diese Zufallszahl die gleiche ist wie die vorherige Zufallszahl, nicht wenn diese zufällig ist Nummer ist die s ame als das vorherige Bild, das – Paulw11

+0

in loadPicture() vor resetTimer() Zeile write timer = nil angezeigt wurde. . . – iHart

+0

Um nur sicherzustellen, erstellen Sie den Timer in demselben Thread? Zweitens, hast du versucht, die Zeit um 5 Sekunden zu erhöhen? – Shripada

Antwort

11

Also habe ich es endlich ...

ich eine eigene Funktion zu machen, hatte den Timer zu starten, indem Sie es zu initialisieren. Und in der Funktion resetTimer() habe ich die timer.invalidate() Zeile hinzugefügt. So sieht mein Code wie folgt aus:

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

Mit dem neuen Selektor Syntax sieht es wie folgt aus:

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

'NSTimer.scheduledTimerWithTimeInterval' wird mir eine neue Instanz von NSTimer zurückgeben, oder? Gibt es eine Möglichkeit, den Timer, wie, die gleiche Timer-Instanz nur zurückzusetzen ? – Que20

+0

Nein, ich glaube nicht. Sie können es ungültig machen, aber wenn Sie das tun, können Sie es nicht wieder starten. @ Que20 –