繁体   English   中英

如何使 SwiftUI 中的视图更新即时?

[英]How to make the View update instant in SwiftUI?

我有一个Text用作具有不同数组值的计时器。 它与timerIntervalSinceNow一起显示。

问题是当它达到零时,它应该显示为零,但在再次单击屏幕之前不会发生这种情况。 如果我不点击它,它会继续上升,因为它是timeIntervalSinceNow ,但是当我点击它时,它会切换到Text with 0 sec

有什么方法可以告诉 SwiftUI 在不点击的情况下自行执行此操作吗?

if(exerciseTime[value].timeIntervalSinceNow > 0) {
    Text(exerciseTime[value], style:.relative).foregroundColor(.white).font(.largeTitle).padding(.top, 30)                                   
} else {
    Text("0 sec").foregroundColor(.white).font(.largeTitle).padding(.top, 30)
}

问题是exerciseTime[value]永远不会改变,因此不会重绘视图。

尽管exerciseTime[value].timeIntervalSinceNow可能不同,但实际的exerciseTime[value]保持不变。

我建议您改用带有ObservableObjectTimer

import Combine
import SwiftUI

class TimerViewModel: ObservableObject {
    private var timer: AnyCancellable?

    @Published var currentDate = Date()

    func start(endDate: Date) {
        timer = Timer.publish(every: 1.0, on: .main, in: .default)
            .autoconnect()
            .sink { [weak self] in
                guard let self = self else { return }
                self.currentDate = $0
                if self.currentDate >= endDate {
                    self.timer = nil
                }
            }
    }
}

并在您的视图中使用它:

struct TestView: View {
    @State private var exerciseTime = Calendar.current.date(byAdding: .second, value: 15, to: Date())!
    @StateObject private var timer = TimerViewModel()

    var body: some View {
        Group {
            if timer.currentDate < exerciseTime {
                Text(exerciseTime, style: .relative)
            } else {
                Text("0 sec")
            }
        }
        .foregroundColor(.white)
        .font(.largeTitle)
        .padding(.top, 30)
        .onAppear {
            timer.start(endDate: exerciseTime)
        }
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM