SwiftUI-如何将秒转换为分钟:秒?

问题描述 投票:0回答:2

我正在尝试在 SwiftUI 中制作一个计时器,到目前为止一切正常,但我不知道如何将秒格式化为秒和分钟。例如,如果倒计时为 299 秒,我希望它显示 4(分钟):59(秒)而不是仅 300 秒。

我在 youtube 上看到了一个制作计时器的视频,他们设法通过制作分钟和秒常量来格式化它,然后通过函数对其进行格式化,但它对我来说并没有真正起作用。

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 value = String(format:"%d:%02\(300/60)", countdownTimer)
        return value
    }
    
    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") {
                    if timerRunning == true {
                        timerRunning = false
                    } else {
                        timerRunning = true
                    }
                    
                }
                .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()
    }
}
swift swiftui format
2个回答
4
投票

您可以使用这样的扩展类。在该代码之后,您将在 int 值中看到一个方法。

您可以使用 countdownTimer.convertDurationToString()

extension Int {
    
    public func hmsFrom() -> (Int, Int, Int) {
        return (self / 3600, (self % 3600) / 60, (self % 3600) % 60)
    }
    
    public func convertDurationToString() -> String {
        var duration = ""
        let (hour, minute, second) = self.hmsFrom()
        if (hour > 0) {
            duration = self.getHour(hour: hour)
        }
        return "\(duration)\(self.getMinute(minute: minute))\(self.getSecond(second: second))"
    }
    
    private func getHour(hour: Int) -> String {
        var duration = "\(hour):"
        if (hour < 10) {
            duration = "0\(hour):"
        }
        return duration
    }
    
    private func getMinute(minute: Int) -> String {
        if (minute == 0) {
            return "00:"
        }

        if (minute < 10) {
            return "0\(minute):"
        }

        return "\(minute):"
    }
    
    private func getSecond(second: Int) -> String {
        if (second == 0){
            return "00"
        }

        if (second < 10) {
            return "0\(second)"
        }
        return "\(second)"
    }
}

0
投票

您可以将

DateComponentsFormatter
配置为
positional
的unitsStyle,以创建可从 SwiftUI 轻松使用的格式化程序。

struct TimerCountdownFormatStyle: FormatStyle {
    func format(_ value: Int) -> String {
        let formatter = DateComponentsFormatter()
        formatter.allowedUnits = [.minute, .second]
        formatter.unitsStyle = .positional
        formatter.zeroFormattingBehavior = .pad
        return formatter.string(from: TimeInterval(value)) ?? ""
    }
}

extension FormatStyle where Self == TimerCountdownFormatStyle {
    static var timerCountdown: TimerCountdownFormatStyle { TimerCountdownFormatStyle() }
}

使用示例

Text(remainingTime, format: .timerCountdown)
© www.soinside.com 2019 - 2024. All rights reserved.