SwiftUI技术问询:如何将秒数格式化为分:秒格式?
解决SwiftUI计时器秒数转“分:秒”格式问题
你的核心问题出在format函数的实现上,硬编码了固定值且格式化语法错误,导致无法动态转换剩余秒数为“分:秒”格式。
修正后的格式化函数
替换原有的format函数为以下代码:
func format(result: Int) -> String { let minutes = result / 60 // 计算剩余分钟数 let seconds = result % 60 // 计算剩余秒数 return String(format: "%d:%02d", minutes, seconds) // %02d确保秒数为两位,不足补0 }
完整修正后的代码
import SwiftUI struct TimerView: View { var timerEnd = 0 @State var countdownTimer = 300 @State var timerRunning = false @State var isPaused = false @State var isActive = false @State var showingAlert = false let timer = Timer.publish(every: 1, tolerance: 0.5, on: .main, in: .common).autoconnect() func format(result: Int) -> String { let minutes = result / 60 let seconds = result % 60 return String(format: "%d:%02d", minutes, seconds) } func reset() { countdownTimer = 300 timerRunning = true } var body: some View { VStack { Text("Time: \(format(result: countdownTimer))") .padding() .onReceive(timer) { _ in if countdownTimer > 0 && timerRunning { countdownTimer -= 1 } else { timerRunning = false } } .font(.system(size: 30)) HStack(spacing:30) { Button(timerRunning ? "Reset" : "Start") { reset() } .padding() .background((Color(red: 184/255, green: 243/255, blue: 255/255))) .foregroundColor(.black) .cornerRadius(10) .font(Font.system(size: UIFontMetrics.default.scaledValue(for: 16))) Button(timerRunning ? "Pause" : "Resume") { timerRunning.toggle() // 简化逻辑,效果与原代码一致 } .padding() .foregroundColor(.black) .background(.red) .cornerRadius(10) .font(Font.system(size: UIFontMetrics.default.scaledValue(for: 16))) } } } } struct TimerView_Previews: PreviewProvider { static var previews: some View { TimerView() } }
另外,Pause/Resume按钮的逻辑可以简化为timerRunning.toggle(),效果和原代码完全相同,让代码更简洁。
测试时,当countdownTimer为299秒时,会正确显示4:59,符合你的需求。
内容的提问来源于stack exchange,提问作者Zudoturiku
相关产品推荐
相关产品推荐

