Swift-ScheduledTimer秒表小时数部分不工作

2022-08-21 00:00:00 ios swift nstimer

请原谅,一周前我学会了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]捕获列表,我们打破了这个循环,允许在解除视图控制器时释放它,它将为您停止计时器。

相关文章