如何在SwiftUI中即时更新视图



我有一个Text,它充当一个计时器,具有我的数组的不同值。并以timerIntervalSinceNow显示。

问题是,当它达到零时,它应该显示为零,但在再次点击屏幕之前不会出现这种情况。如果我不点击它,它会一直上升,因为它是timeIntervalSinceNow,但当我点击它时,它会切换到带有0 secText

有没有办法告诉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]仍然保持不变。

我建议您使用TimerObservableObject

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)
}
}
}

相关内容

  • 没有找到相关文章

最新更新