Timer Reset

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Timer Reset

    Hallo zusammen,

    ich komme gerade nicht weiter und habe schon einiges recherchiert, nun hoffe ich auf eine Idee von euch 8)

    Ich erstelle eine Stoppuhr App mit Storyboard. Dabei habe ich 2 Buttons (einer macht den Start / Stop und der zweite soll das Reset übernehmen. Zudem gibt es 1 Label zur Anzeige der Stoßzeit.

    Soweit funktioniert meine Stoppuhr. Erst habe ich es mit einer festen Variable gestartet, da funktioniert der Reset auch super. Nun wollte ich das ganze mal mit timeIntervalSinceNow realisieren, leider bekomme ich nun den Reset nicht mehr hin ?(
    Wo ist denn mein Knoten im Hirn? Mit timer=nil bekomme ich eine Fehlermeldung.

    Ah und nicht wundern, durch das testen und versuchen ist noch die ein oder andere Variable da :)

    Quellcode

    1. import UIKit
    2. class ViewController: UIViewController {
    3. //Variablen die benötigt werden festlegen
    4. var timer : Timer?
    5. var timerAn = false
    6. var timerReset = false
    7. var startZeit = TimeInterval()
    8. var zeit = Date()
    9. //Outlets erstellen für Text- und Farbwechsel und disablen
    10. @IBOutlet weak var zeitLabel: UILabel!
    11. @IBOutlet weak var startStopButton: UIButton!
    12. @IBOutlet weak var resetButton: UIButton!
    13. //Funktion was passiert wenn der Button getrückt wird, wenn der Timer läuft oder nicht
    14. @IBAction func timerTapped(_ sender: Any) {
    15. if timerAn == false {//&& timerReset == false {
    16. //Tittle, Hintergrundfarbe und Textfarbe ändern
    17. startStopButton.setTitle("Stopp", for: .normal)
    18. startStopButton.backgroundColor = UIColor.red
    19. startStopButton.tintColor = UIColor.black
    20. //Timer auf true setzen
    21. timerAn = true
    22. //Resetbutton enablen, vorher passiert nichts
    23. resetButton.isEnabled = true
    24. timer = Timer.scheduledTimer(timeInterval: 1.0, target: self, selector: #selector(zeitUpdate), userInfo: nil, repeats: true)
    25. }
    26. else {
    27. // Wenn der Timer läuft soll folgendes passieren
    28. if timerAn == true {
    29. //Timer wird gestoppt
    30. timer?.invalidate()
    31. //Titel im Button wird in Start geändet
    32. startStopButton.setTitle("Start", for: .normal)
    33. // Timer wird auf aus gesetzt
    34. timerAn = false
    35. //Hintergrund und Textfarbe ändern
    36. startStopButton.backgroundColor = UIColor.green
    37. startStopButton.tintColor = UIColor.blue
    38. }
    39. }
    40. }
    41. @objc func zeitUpdate() {
    42. //Zeitberechnung durchführen, Werte in einen String umwandeln und im Label anzeigen
    43. //zeit += 1.0
    44. let now = zeit.timeIntervalSinceNow * -1
    45. // let timeFormater = DateComponentsFormatter()
    46. // timeFormater.unitsStyle = .positional
    47. // timeFormater.allowedUnits = [.hour, .minute, .second]
    48. // timeFormater.zeroFormattingBehavior = [.pad]
    49. let elementeZeit = Int(floor(now))
    50. let stunde = (elementeZeit / 3600)
    51. let stundeStr = String(format: "%02d", stunde)
    52. let minute = (elementeZeit % 3600) / 60
    53. let minuteStr = String(format: "%02d", minute)
    54. let sekunde = (elementeZeit % 3600) % 60
    55. let sekStr = String(format: "%02d", sekunde)
    56. zeitLabel.text = "\(stundeStr):\(minuteStr):\(sekStr)"
    57. }
    58. @IBAction func clearTapped(_ sender: Any) {
    59. //Ist der Timer gestoppt darf der Reset Button alles zurücksetzen
    60. if timerAn == false {
    61. //Label auf 00:00:00
    62. zeitLabel.text = "00:00:00"
    63. //der Reset Button wird wieder disabled
    64. resetButton.isEnabled = false
    65. timerReset = true
    66. }
    67. }
    68. override func viewDidLoad() {
    69. super.viewDidLoad()
    70. // Festlegung was mit den Buttons am Start passieren soll
    71. resetButton.isEnabled = false
    72. //Form des StartStop Buttons ändern
    73. startStopButton.layer.cornerRadius = startStopButton.bounds.width / 2.0
    74. startStopButton.layer.masksToBounds = true
    75. //Farbe zum Start auf Grün setzen
    76. startStopButton.backgroundColor = UIColor.green
    77. }
    78. }
    Alles anzeigen
  • Hi Mc Dan,

    ich habe jetzt deinen Vorschlag in den Reset Abschnitt eingebaut und der Reset funktioniert jetzt auch :rolleyes: .. danke.
    Allerdings funktioniert mein Timer.invalidate() beim Stop des Timers nicht mehr ?( er läuft im Hintergrund einfach weiter :thumbdown: wenn ich wieder den Startbutton klicke geht er einfach höher weiter. Ich weiß jetzt nicht was ich angerichtet habe ||

    Hast du da etwa auch noch einen Tipp für mich?
  • Yvi schrieb:

    @ObjC func zeitUpdate() {
    //Zeitberechnung durchführen, Werte in einen String umwandeln und im Label anzeigen
    //zeit += 1.0
    let now = zeit.timeIntervalSinceNow * -1
    Hi Dan,

    aber jetzt muss ich noch blöd fragen, mache ich das nicht mit der Code Zeile let now? Habe ich da gerade ein Verständnisproblem?
    Diese Zeile sagt doch das ich von der jetzigen Zeit an, die Timerberechnung starte oder?

    Was ich nicht verstehe das mein timer.invalidate() keine Wirkung zeigt.
    Ich habe auch etwas in der Apple Dokumentation gefunden aber verstehe nicht den Passus mit thread. Was bedeutet das?


    Special Considerations
    You must send this message from the thread on which the timer was installed. If you send this message from another thread, the input source associated with the timer may not be removed from its run loop, which could prevent the thread from exiting properly.
  • zeit.timeIntervalSinceNow berechnet den TimeInterval zwischen Datum+Uhrzeit von zeit und jetzt.

    Du kannst damit die verstrichene Zeit zwischen Datum+Uhrzeit von zeit und jetzt berechnen. Soweit ist dies ok und funktioniert.

    Da Du zeit jedoch nicht beim Start des Timers für die Stoppuhr setzt, wird jedoch nicht mit der korrekten Startzeit gerechnet.

    Wenn Du den Timer stoppst und danach wieder startest könnte dies für Dich so aussehen, als würde dieser weiterlaufen.

    Allerdings läuft nur die verstrichene Zeit weiter, da Du die Startzeit beim Start des Timers ja nicht neu setzt. ;)

    Aktuell zeigt der o.a. Code also die verstrichene Zeit seit dem Start der App an, also dem Zeitpunkt, als zeit beim Init der Klasse gesetzt wurde.
  • Ich habe jetzt noch einiges versucht aber steige ehrlich gesagt leider nicht durch ;( Der Timer läuft einfach immer weiter, einmal in die Zukunft und wenn ich etwas anderes versuche ins minus.

    Muss ich jetzt beim Stoppen den Wert der vergangen Sekunden abspeichern und beim erneuten Starten wieder verwenden?
    Beutet das ich auch eine neue If Schleife einbauen muss oder?

    Sorry für die dummen Fragen, bin halt noch Anfänger und versuche das ganze einfach zu verstehen.
  • Mache es dir erst einmal einfach. Statt Start/Stopp/Reset, einfach nur Start und Stopp. Also beim Drücken auf Start wird auf 0:00 gestellt und bis zum Stoppen hoch gezählt.

    Wenn das funktioniert, kannst Du dann die Variante mit Start/Stopp/Reset implementieren. Laut deiner letzten Antwort ist dir eh schon klar, wie das im Prinzip funktionieren soll. Implementieren kann man das auf unterschiedliche weise.