2016-04-08 3 views
0

Ich benutze Swift 2+ und mache eine Stoppuhr/Timer.Wie kann ich meine Swift-Klasse dazu bringen, das Etikett in meinem Viewcontroller in Echtzeit zu aktualisieren?

Grundsätzlich habe ich eine Klasse, StopWatch2, die ich von meinem ViewController aufrufen kann.

Ich kann den Timer innerhalb der Klasse starten, ausführen, stoppen und zurücksetzen.

Ich kann es auch machen die Aktualisierung der Bezeichnung in meinem ViewController, aber nur für 'jetzt.' Zum Beispiel, wenn ich den Timer starte, wird die Bezeichnung 7:59 sagen. Ich kann in meinem Druckprotokoll sehen, dass der Timer herunter zählt, aber das Etikett wird nicht aktualisiert. Wenn ich auf "Stop" klicke, wird das Label mit der aktuellen Uhrzeit aktualisiert.

Der gesamte Code ist hier - https://github.com/markie1313/Debate-Timer. Wenn ich Codebeispiele posten muss, würde ich mich freuen.

Was ist zu tun?

Marke

UPDATE:

Sorry für die Verspätung. Hier ist der Code Ich verwende für die Viewcontroller

Klasse ViewController2AC: UIViewController { var newTimer = StopWatch2()

@IBOutlet var timerText: UILabel! 
@IBOutlet var startStopButton: UIButton! 

@IBAction func startStopTimer(sender: AnyObject) { 
    timerText.text = "8:00" 
    newTimer.startStop() 
    timerText.text = newTimer.stopWatchString 

}

override func viewDidLoad() { 
    super.viewDidLoad() 
    newTimer.minutes = 7 
    newTimer.seconds = 60 
}  

}

Hier sind die Funktionen genannt:

func startStop() { 

    if startStopwatch == true { 
     timer = NSTimer.scheduledTimerWithTimeInterval(1, target: self, selector: Selector("updateStopwatch"), userInfo: nil, repeats: true) 
     startStopwatch = false 
     startStopButtonExt = "Stop" 
    } else { 
     timer.invalidate() 
     startStopwatch = true 
     startStopButtonExt = "Start" 
    } 
} 

func updateStopwatch() -> String { 
    seconds -= 1 
    if seconds == 0 && minutes == 0 { 
     timer.invalidate() 
     labelText = "0:00" 
     return self.labelText 
    } 
    if seconds == 0 { 
     labelText = "\(minutes):00" 
     print(labelText) 
     minutes -= 1 
     seconds = 60 
    } 
    var secondsString = seconds > 9 ? "\(seconds)" : "0\(seconds)" 
    var minutesString = minutes > 9 ? "\(minutes)" : "\(minutes)" 
    if seconds == 60 { 
     secondsString = "00" 
     minutesString = "\(minutes + 1)" 
    } 
    stopWatchString = "\(minutesString):\(secondsString)" 
    labelText = stopWatchString 
    print("\(stopWatchString) test") 
    return self.stopWatchString 
} 
+0

sollten Sie den Code buchen, anstatt ihn zu verknüpfen. Begrenzen Sie dies auf den Code für den Timer und wie es das Etikett aktualisiert – Wain

+0

Stellen Sie sicher, dass die Benutzeroberfläche immer auf dem Hauptthread aktualisiert wird, – vadian

+1

Bitte schreiben Sie den Code des Viewcontrollers Sie tatsächlich verwenden, da ich viele Klassen in einem sehen kann Datei, die verwirrend ist. Ich sehe auch nicht, dass du StopWatch2 überall instanzist !? –

Antwort

0

Sie müssen view.setNeedsDisplay jedes Mal aufrufen, wenn Sie UI-Labels im Hauptthread von einem anderen Thread aus bearbeiten möchten.

0

Sie müssen Beschriftungstext am Ende des updateStopwatch Verfahren aktualisieren:

timerText.text = labelText 

Auch empfehle ich Ihnen, Format-String statt number > 9

String(format: "%02d", myInt) 

Dies gilt führende Nullen auf Ihre Nummer zu verwenden

Verwandte Themen