如何让我的Swift类实时更新viewcontroller中的标签?

时间:2016-04-08 12:42:38

标签: ios swift class timer nstimer

我正在使用Swift 2+并做秒表/计时器。

基本上,我有一个类,StopWatch2,我可以从我的ViewController调用。

我可以让班级内的计时器启动,运行,停止和重置。

我也可以让它更新我的ViewController中的标签,但仅限'now'。例如,如果我启动计时器,标签会说7:59。我可以在我的打印日志中看到计时器正在倒计时,但它没有更新标签。如果我点击“停止”,标签将以当前时间更新。

所有代码都在这里 - https://github.com/markie1313/Debate-Timer。如果我需要发布代码示例,我会很高兴。

怎么办?

标记

更新:

抱歉延误。这是我用于ViewController的代码

class 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
}    

}

以下是被调用的函数:

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
}

2 个答案:

答案 0 :(得分:0)

每次要在主线程上操作不同的UI标签时,都必须调用view.setNeedsDisplay

答案 1 :(得分:0)

您必须在updateStopwatch方法的末尾更新标签文字:

timerText.text = labelText

另外,我建议您使用格式字符串而不是number > 9

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

这会将前导零应用于您的号码