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)
}
}
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
Bitte erläutern Sie die Absicht Ihres Codes ein wenig mehr? So wie es ist, frage ich mich über ein paar Dinge. – Feldur
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