gpt4 book ai didi

ios - Swift - scheduledTimer 秒表小时部分不工作

转载 作者:行者123 更新时间:2023-11-28 15:33:09 24 4
gpt4 key购买 nike

请耐心等待我一周前学习了 Swift 和 Xcode(我正在创建一个应用程序以在假期中学习 Swift)

我使用 scheduledTimer 创建了一个计时器作为秒表。秒和分钟运行良好,但我无法按时工作。我做错了什么?

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它们,但是 View Controller 的deinit直到计时器对 View Controller 的强引用已解决。通过在闭包中使用 [weak self] 捕获列表,我们打破了这个循环,允许 View Controller 在它被关闭时被释放,它会为你停止计时器。

关于ios - Swift - scheduledTimer 秒表小时部分不工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44555604/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com