You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 06:15:33