【问题标题】:SwiftUI Schedule Countdown Timer - Pause & StartSwiftUI 计划倒数计时器 - 暂停和开始
【发布时间】:2020-07-27 15:23:57
【问题描述】:

我正在尝试为我的应用程序设置时钟(实际时间)/计时器(倒计时)。我知道我的解决方案有点粗糙,但一切正常,但是。当我暂停倒计时然后重新开始时 - 第一次计数器添加时间(大约一秒钟),因为我按下暂停按钮,然后加载我保存的 timeCounter 值并继续倒计时.. 为什么?另外,如果您有更好的更流畅的解决方案,我会非常高兴.. 谢谢!

    import SwiftUI

    struct Clock : View {

    @State private var nowDate: Date = Date()
    @State private var referenceDate: Date = Date()
    @State private var display: Bool = true

    @State private var updateTimer: Timer?

    @State private var timeCounter: Double = 0
    @State private var timerRunning: Bool = false

    var body: some View {
        VStack {
            Button(action: {
                self.display.toggle()
             }) {
                Text(display ? "COUNTDOWN" : "TIME")
            }

            Text(display ? "\(timeString(date: nowDate))" : "\(countDownString(for: referenceDate))")

            HStack {
                Button(action: {
                    self.display = false
                    self.timeCounter = 10
                    self.referenceDate = Date(timeIntervalSinceNow: self.timeCounter)
                }) {
                    Text("10")
                }
            }

            Button(action: {
                if self.timerRunning {
                    self.referenceDate = Date(timeIntervalSinceNow: self.timeCounter)
                    self.startTimer()
                    self.timerRunning.toggle()
                } else {
                    self.updateTimer?.invalidate()
                    self.timerRunning.toggle()
                }
            }) {
                Text(timerRunning ? "START" : "PAUSE")
            }
        }
        .onAppear {
            self.startTimer()
        }
    }

    //MARK: Timer
         func startTimer() {
        self.updateTimer = Timer.scheduledTimer(withTimeInterval: 1, repeats: true) { _ in
            self.nowDate = Date()
            if self.referenceDate.distance(to: self.nowDate) >= 0 {
                self.referenceDate = Date(timeIntervalSinceNow: 0)
                self.display = true
            }
            self.timeCounter -= 1
        }
    }

    //MARK: - CountDown Timer

    func countDownString(for date: Date) -> String {
        let calendar = Calendar(identifier: .gregorian)
        let components = calendar
            .dateComponents([.hour, .minute, .second],
                            from: nowDate,
                            to: referenceDate)
        return String(format: "%02d:%02d:%02d",
                      components.hour ?? 00,
                      components.minute ?? 00,
                      components.second ?? 00)
    }

    //MARK: - Clock Timer

    var timeFormat: DateFormatter {
        let formatter = DateFormatter()
        formatter.dateFormat = "HH:mm:ss"
        return formatter
    }

    func timeString(date: Date) -> String {
        let time = timeFormat.string(from: date)
        return time
    }
}

【问题讨论】:

    标签: timer swiftui countdown clock


    【解决方案1】:
    【解决方案2】:

    我在网上看到了很多复杂的方法。

    iOS 14 中的新功能:

    let closeDate = Date(timeIntervalSinceNow: 60.0)
    Text(closeDate, style: .relative)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-08-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多