2017-07-23 8 views
3

Ich versuche einen Countdown-Timer für meine App einzustellen. Mein Code funktioniert so, dass jedes Mal, wenn das Bild "whiteDot" gezogen wird und "smallDot" enthält, der Countdown beginnt und "smallDot" in zufälliger Position auf dem Bildschirm erscheint. Ich habe ein paar FragenTimer läuft negativ/nicht zurückgesetzt

1.) Ich versuche, um den Timer zu erhalten bis 2 Sekunden nach jedem Mal, wenn die „if (whiteDot.frame.contains (smallDot.frame) & & smallDot.image zurückgesetzt! = Nil) "Anweisung wird ausgeführt.

2.) Immer wenn die "if" -Anweisung einmal ausgeführt wird, zählt sie normal, aber wenn sie erneut ausgeführt wird, bevor der Countdown Null erreicht, beginnt sie in negative Zahlen zu gehen und schneller als 1 Sekunde zu zählen.

import UIKit 

var timeClock = 2 

class SecondViewController: UIViewController { 

func startTimer() { 
    timeClock -= 1 
    time.text = "Time: " + String(timeClock) 

if whiteDot.frame.contains(smallDot.frame) && timeClock > 0 { 
     timeClock = 2 
    } 

    else if timeClock == 0 || timeClock < 0 { 
     timer.invalidate() 
    } 
} 

var timer = Timer() 

@IBAction func handlePan(recognizer:UIPanGestureRecognizer) { 
    let translation = recognizer.translation(in: self.view) 
    if let view = recognizer.view { 
     view.center = CGPoint(x:view.center.x + translation.x, 
           y:view.center.y + translation.y) 
    } 
    recognizer.setTranslation(CGPoint.zero, in: self.view) 

    if (whiteDot.frame.contains(smallDot.frame) && smallDot.image != nil) { 
     addOne += 1 

     score.text = "\(addOne)" 

     smallDot.center = spawnRandomPosition() 

timeClock = 2 
     if timeClock == 0 || timeClock < 0 { 
      timer.invalidate() 
     } 
     else if timeClock > 0 && (whiteDot.frame.contains(smallDot.frame)){ 
      timeClock = 2 

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

Ich kann den Timer nicht sofort initialisieren (var timer: Timer!). Der Timer-Code wird, wenn ich es richtig verstehe, nach Ablauf der benötigten Zeit auf einen anderen Thread mit einem Callback geworfen. Eine Sache, die ich hier nicht sehe, ist das Ungültigmachen Ihres Timers, was wichtig ist. Wenn Timer mit unterschiedlichen Dauern gezündet werden müssen, würde ich vielleicht eine Funktion machen, die einen TimerInterval als Argument nimmt und die folgenden Schritte ausführt: 1) den vorherigen Timer ungültig machen 2) einen neuen Timer mit der abgelaufenen Dauer erzeugen. – solenoid

+0

Bitte erläutern Sie die Absicht Ihres Codes ein wenig mehr? So wie es ist, frage ich mich über ein paar Dinge. – Feldur

+0

Im Code wird die Aktionsroutine etwa einmal pro Sekunde aufgerufen. 1. Beschreibt das Problem, das Sie beschreiben möchten, dass timeClock positiv sein soll? 2. Ich sehe nirgendwo, dass Sie den Wert von timeClock zurücksetzen, so dass es auf unbestimmte Zeit rückwärts zählt. Ist das nicht das, was du bist? Sie könnten einer von ein paar Dinge tun: 1. Sie können den Timer beenden, wenn Zeituhr auf Null 2. bekommt Man könnte Zeituhr zu einem gewissen positiven Wert zurückgesetzt, wenn sie negativ Info Mehr geht? – Feldur

Antwort

1

Habe gerade mein Problem herausgefunden. Ich habe den Timer überhaupt nicht zurückgesetzt. Zuerst habe ich versucht, es in der "Action" -Funktion zurückzusetzen, aber ich musste es nur nach unten verschieben, um alle meine Probleme zu lösen. Dieser Code funktioniert für jeden, der versucht, seinen Timer zurückzusetzen, wenn eine bestimmte Aktion auftritt.

class SecondViewController: UIViewController 
{ 
var addOne = 0 

func startTimer() { 

    timeClock -= 1 

    time.text = "Time: " + String(timeClock) 

    if timeClock <= 0 { 
    timer.invalidate() 
    //show game over 
    } 
} 

func resetTimer() { 
    timer.invalidate() 
    timeClock = 3 
} 
var timer = Timer() 

@IBAction func handlePan(recognizer:UIPanGestureRecognizer) { 
    let translation = recognizer.translation(in: self.view) 
    if let view = recognizer.view { 
     view.center = CGPoint(x:view.center.x + translation.x, 
           y:view.center.y + translation.y) 
    } 
    recognizer.setTranslation(CGPoint.zero, in: self.view) 

    if (whiteDot.frame.contains(smallDot.frame) && smallDot.image != nil) { 
     addOne += 1 

    score.text = "\(addOne)" 

     resetTimer() 

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

     smallDot.center = spawnRandomPosition() 
    } 
    } 
0
var timeClock = 2 

Da dies innerhalb einer Klasse erscheint aber außerhalb jeder Methode, erklärt diese Linie eine Eigenschaft für die Klasse timeClock und initialisiert es 2 genannt. Dies ist der Startwert für die Eigenschaft timeClock für jede Instanz der Klasse, die Sie erstellen.

Sie aktualisieren diesen Wert korrekt, wenn Sie rückwärts zählen, aber nirgends setzen Sie ihn auf 2 zurück. Wenn die Property-Deklaration niedriger als die action()-Methode ist, heißt das nicht, dass sie anschließend ausgeführt wird. Die Eigenschaft wird nur einmal pro Instanz initialisiert.

Was Sie tun möchten, ist entweder der Wert von timeClock-2 einstellen, bevor Sie den Timer zu planen, oder es 2 gesetzt, nachdem Sie den Timer ungültig machen. In jedem Fall müssen Sie es irgendwo auf 2 zurücksetzen.

+0

Ich habe gerade meinen Code aktualisiert und timeClock = 2 gesetzt. Außerdem habe ich versucht, ihn in der "else if" -Anweisung zurückzusetzen.Ich habe immer noch das Problem, wenn die "if" -Anweisung einmal ausgeführt wird und der Countdown startet, und es erneut ausgeführt wird, bevor der Countdown Null erreicht, wird der Countdown nicht ungültig, und die Zahlen gehen in die Negative (auch Start) Countdown mit einer zufälligen Geschwindigkeit, die keine Sekunde ist) – ZDP

Verwandte Themen