我想实现一个NSTimer来显示一个使用NSTimeInterval的计时器,所以我环顾四周找到了这个代码,我把它放到我的ViewModel层中:
public class ViewModel {
public func startTimer() {
//if !timer.valid {
timer = NSTimer.scheduledTimerWithTimeInterval(0.01, target: self, selector: #selector(updateTime), userInfo: nil, repeats: true)
startTime = NSDate.timeIntervalSinceReferenceDate()
//}
}
@objc public func updateTime() -> String {
let currentTime = NSDate.timeIntervalSinceReferenceDate()
//Find the difference between current time and start time.
var elapsedTime: NSTimeInterval = currentTime - startTime
//calculate the minutes in elapsed time.
let minutes = UInt8(elapsedTime / 60.0)
elapsedTime -= (NSTimeInterval(minutes) * 60)
//calculate the seconds in elapsed time.
let seconds = UInt8(elapsedTime)
elapsedTime -= NSTimeInterval(seconds)
//add the leading zero for minutes, seconds and millseconds and store them as string constants
let strMinutes = String(format: "%02d", minutes)
let strSeconds = String(format: "%02d", seconds)
//concatenate minuets, seconds and milliseconds as assign it to the UILabel
return "\(strMinutes):\(strSeconds)"
}
}
我想在我的视图中显示当前已用完的时间,所以尝试了这个但是它不起作用:
viewModel?.startTimer()
timerLabel.text = viewModel?.updateTime()
如何在ViewController标签上显示updateTime()
的最新结果?
答案 0 :(得分:0)
updateTime
方法不能只返回字符串。它必须启动相关标签的更新。您可以对其进行编码以直接更新标签,也可以提供updateTime
在具有字符串值时将调用的闭包。
答案 1 :(得分:0)
我试图实现Rob的答案,但是无法真正掌握MVVM架构中的CAdisplayLink,并且想出了在不同视图中定期更新GUI元素的相同问题。
但是我使用了我的RAC知识并创建并传递了RACSignal
来更新我的ViewController:
RACSignal.interval(1.0, onScheduler: .mainThreadScheduler()).subscribeNext({ _ in
self.timerLabel.text = self.viewModel?.updateTime()
})