Swift-ScheduledTimer秒表小时数部分不工作
请原谅,一周前我学会了SWIFT和Xcode(我正在开发一款应用程序,以便在假期学习SWIFT)
我使用SchedTimer创建了一个计时器来充当秒表。时间过得很好,但我不能把时间花在工作上。我做错了什么?
currentTime = 0
timer = Timer.scheduledTimer(withTimeInterval: 1.0, repeats: true) { _ in
self.currentTime += 1
let hoursPortion = String(format: "%02d", CGFloat(self.currentTime) * 60)
let minutesPortion = String(format: "%02d", self.currentTime / 60)
let secondsPortion = String(format: "%02d", self.currentTime % 60)
//let tenPortion = String(format: "%d", self.currentTime * 10 % 10)
self.TimerDisplay.text = "(hoursPortion):(minutesPortion):(secondsPortion)"
}
解决方案
正如其他人所说,您不应该尝试自己记录时间。让系统计算出已经过去了多少时间。而且,我也倾向于使用DateComponentsFormatter
为您设置字符串的格式:
@IBOutlet weak var elapsedLabel: UILabel!
weak var timer: Timer?
private var formatter: DateComponentsFormatter = {
let formatter = DateComponentsFormatter()
formatter.unitsStyle = .positional
formatter.allowedUnits = [.hour, .minute, .second]
formatter.zeroFormattingBehavior = .pad
return formatter
}()
private func startTimer() {
timer?.invalidate() // stop prior timer, if any
let startTime = Date()
timer = Timer.scheduledTimer(withTimeInterval: 1.0, repeats: true) { [weak self] _ in
self?.elapsedLabel.text = self?.formatter.string(from: startTime, to: Date())
}
}
deinit {
timer?.invalidate()
}
顺便说一句,这是一个微妙的问题,但请注意Timer
闭包捕获列表中[weak self]
的用法。如果没有这种情况,您就会有一个强引用周期的变体,因为计时器直到您invalidate
才停止,而视图控制器的deinit
直到计时器对视图控制器的强引用被解析后才能被调用。通过使用闭包中的[weak self]
捕获列表,我们打破了这个循环,允许在解除视图控制器时释放它,它将为您停止计时器。
相关文章