gpt4 book ai didi

SwiftUI - 如何制作启动/停止计时器

转载 作者:行者123 更新时间:2023-12-04 11:51:49 26 4
gpt4 key购买 nike

我的目标是在 SwiftUI 中创建一个从 0 开始的 View 。当你按下 View 时,计时器应该开始向上计数,再次点击停止计时器。最后,当您再次点击以启动计时器时,计时器应从 0 开始。
这是我当前的代码:

import SwiftUI

struct TimerView: View {
@State var isTimerRunning = false
@State private var endTime = Date()
@State private var startTime = Date()
let timer = Timer.publish(every: 0.001, on: .main, in: .common).autoconnect()

var tap: some Gesture {
TapGesture(count: 1)
.onEnded({
isTimerRunning.toggle()
})
}

var body: some View {

Text("\(endTime.timeIntervalSince1970 - startTime.timeIntervalSince1970)")
.font(.largeTitle)
.gesture(tap)
.onReceive(timer) { input in
startTime = isTimerRunning ? startTime : Date()
endTime = isTimerRunning ? input : endTime
}

}
}
此代码使计时器立即启动并且永不停止,即使我点击它也是如此。计时器也会向后(变为负数)而不是向前。
有人可以帮我理解我做错了什么吗?另外,我想知道这是否是计时器的整体策略(使用 Timer.publish)。
谢谢!

最佳答案

这是一个固定版本。看看我所做的更改。

  • .onReceive现在更新 timerString如果计时器正在运行。 timeString 是现在(即 Date() )和 startTime 之间的间隔.
  • 点击计时器设置 startTime如果它没有运行。
  • struct TimerView: View {
    @State var isTimerRunning = false
    @State private var startTime = Date()
    @State private var timerString = "0.00"
    let timer = Timer.publish(every: 0.01, on: .main, in: .common).autoconnect()

    var body: some View {

    Text(self.timerString)
    .font(Font.system(.largeTitle, design: .monospaced))
    .onReceive(timer) { _ in
    if self.isTimerRunning {
    timerString = String(format: "%.2f", (Date().timeIntervalSince( self.startTime)))
    }
    }
    .onTapGesture {
    if !isTimerRunning {
    timerString = "0.00"
    startTime = Date()
    }
    isTimerRunning.toggle()
    }
    }
    }

    上面的版本虽然简单,但让我觉得 Timer一直在发布。我们只需要 Timer在计时器运行时发布。
    这是一个启动和停止 Timer 的版本:
    struct TimerView: View {
    @State var isTimerRunning = false
    @State private var startTime = Date()
    @State private var timerString = "0.00"
    @State private var timer = Timer.publish(every: 1, on: .main, in: .common).autoconnect()

    var body: some View {

    Text(self.timerString)
    .font(Font.system(.largeTitle, design: .monospaced))
    .onReceive(timer) { _ in
    if self.isTimerRunning {
    timerString = String(format: "%.2f", (Date().timeIntervalSince( self.startTime)))
    }
    }
    .onTapGesture {
    if isTimerRunning {
    // stop UI updates
    self.stopTimer()
    } else {
    timerString = "0.00"
    startTime = Date()
    // start UI updates
    self.startTimer()
    }
    isTimerRunning.toggle()
    }
    .onAppear() {
    // no need for UI updates at startup
    self.stopTimer()
    }
    }

    func stopTimer() {
    self.timer.upstream.connect().cancel()
    }

    func startTimer() {
    self.timer = Timer.publish(every: 0.01, on: .main, in: .common).autoconnect()
    }
    }

    关于SwiftUI - 如何制作启动/停止计时器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63548432/

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