2016-05-31 5 views
0

Warum setzt der Startknopf meiner Stoppuhr den Timer zurück, nachdem Stop gedrückt wurde? Alles funktioniert gut, bis ich den Timer stoppe und dann neu starte. Es sollte an der Stelle fortgesetzt, wo sie gestoppt wurde, sondern setzt sie den Timer auf 0 Hier ist mein Code:der Startknopf meiner Stoppuhr setzt den Timer zurück, nachdem der Stopp aktiviert wurde swift

Klasse Viewcontroller: UIViewController {

var timer = NSTimer() 
var startTime = NSTimeInterval() 

@IBOutlet var displayTimeLabel: UILabel! 

@IBAction func start(sender: AnyObject) { 

    if !timer.valid { 

     timer = NSTimer.scheduledTimerWithTimeInterval(0.1, target: self, selector: #selector(ViewController.updateTime), userInfo: nil, repeats: true) 

    } 

    startTime = NSDate.timeIntervalSinceReferenceDate() 

} 

@IBAction func stop(sender: AnyObject) { 

    timer.invalidate() 
} 

func updateTime() { 

    let currentTime = NSDate.timeIntervalSinceReferenceDate() 
    var elapsedTime: NSTimeInterval = currentTime - startTime 

    let hours = UInt8(elapsedTime/3600) 
    elapsedTime -= (NSTimeInterval(hours) * 3600) 

    let minutes = UInt8(elapsedTime/60) 
    elapsedTime -= (NSTimeInterval(minutes) * 60) 

    let seconds = UInt8(elapsedTime) 
    elapsedTime -= NSTimeInterval(seconds) 

    let fraction = UInt8(elapsedTime * 100) 

    let strHours = String(format: "%02d", hours) 
    let strMinutes = String(format: "%02d", minutes) 
    let strSeconds = String(format: "%02d", seconds) 
    let strFraction = String(format: "%02d", fraction) 

    displayTimeLabel.text = "\(strHours):\(strMinutes):\(strSeconds):\(strFraction)" 

} 

override func viewDidLoad() { 
    super.viewDidLoad() 
    // Do any additional setup after loading the view, typically from a nib. 
} 

override func didReceiveMemoryWarning() { 
    super.didReceiveMemoryWarning() 
    // Dispose of any resources that can be recreated. 
} 

}

+0

Sie setzen 'startTime' in Ihrer' Starten' Methode. Wenn Sie in der Lage sein möchten, weiter zu machen, tun Sie dies nicht – Paulw11

+0

Wenn ich diese Codezeile aus, dann bekomme ich dieses Problem: fataler Fehler: Fließkommawert kann nicht in UInt8 konvertiert werden, weil es größer als UInt8.max ist @ Paulw11 – nodyor90z

Antwort

0

Sie setzen Ihre startTime jedes Mal, wenn die Methode start aufgerufen wird. Sie möchten dies nur beim ersten Aufruf tun. Sie können Optionale verwenden, um den Status korrekt zu bestimmen, und nur startTime festlegen, wenn es anfangs Null ist.

Sie könnten dann eine Reset-Taste mit einer Funktion erstellen, setzt einfach startDate = nil

class ViewController: UIViewController { 

    var timer : NSTimer? 
    var startTime? : NSTimeInterval? 
    var accumulatedTime = NSTimeInterval() 

    @IBOutlet var displayTimeLabel: UILabel! 

    @IBAction func start(sender: AnyObject) { 

     guard self.timer == nil else { 
      return 
     } 

     self.startTime = NSDate.timeIntervalSinceReferenceDate() 

     self.timer = NSTimer.scheduledTimerWithTimeInterval(0.1, target: self, selector: #selector(ViewController.updateTime), userInfo: nil, repeats: true) 
    } 

    @IBAction func stop(sender: AnyObject) { 

     guard self.timer != nil else { 
      return 
     } 

     self.timer!.invalidate() 
     self.timer = nil 
    } 

    func updateTime() { 

     let currentTime = NSDate.timeIntervalSinceReferenceDate() 
     let intervalTime = currentTime - startTime! 
     self.startTime = currentTime 
     self.accumulatedTime += intervalTime 

     var elapsedTime = self.accumulatedTime 

     let hours = UInt8(elapsedTime/3600) 
     elapsedTime -= (NSTimeInterval(hours) * 3600) 

     let minutes = UInt8(elapsedTime/60) 
     elapsedTime -= (NSTimeInterval(minutes) * 60) 

     let seconds = UInt8(elapsedTime) 
     elapsedTime -= NSTimeInterval(seconds) 

     let fraction = UInt8(elapsedTime * 100) 

     let timeString = String(format:"%02d:%02d:%02d.%02d",hours,minutes,seconds,fraction) 
     displayTimeLabel.text = timeString 

    } 
} 
+0

Das funktioniert ein bisschen besser. Aber warum fährt der Timer nicht von dem Punkt aus fort, an dem die Stopp-Taste gedrückt wurde? Es scheint, als würde es immer noch im Hintergrund laufen und aktualisiert das Label, sobald der Start erneut angetippt wird. Wie mache ich es jetzt genau an dem Punkt weiter, an dem die Stopp-Taste gedrückt wurde? – nodyor90z

+0

Weil Ihr Ansatz den Unterschied zwischen der Startzeit und der Stoppzeit unterscheidet, anstatt Zeit zu sammeln, während der Timer läuft. – Paulw11

+0

Siehe meine aktualisierte Antwort; Es setzt startTime jedes Mal, wenn der Timer ausgelöst wird (und jedes Mal, wenn Sie den Startknopf drücken). Auf diese Weise kann die verstrichene Zeit zwischen den Timer-Abfeuerungen und der gesamten verstrichenen Zeit berechnet werden, die stoppt, wenn der Timer stoppt – Paulw11

Verwandte Themen