[英]Passing a timer to a child view in SwiftUI
在我的頂級視圖中,我已經聲明了一個像這樣的計時器:
Struct ContentView: View {
@State var timer = Timer.publish(every: 1, on: .main, in:
.common).autoconnect()
var body: some View {
ZStack {
if self.timerMode == .warmup {
WarmupView(
timer: $timer
)
if self.timerMode == .work {
WorkView(
timer: $timer
)
}
}
}
在子視圖中,我希望能夠訪問和更新這個計時器,它將作為唯一的事實來源。
Struct WarmupView: View {
@Binding var timer: Publishers.Autoconnect<Timer.TimerPublisher>
@Binding var timeRemaining: Int
var body: some View {
VStack {
Text("\(self.timeRemaining)").font(.system(size: 160))
.onReceive(self.timer) { _ in
if self.timeRemaining > 0 {
self.timeRemaining -= 1
}
}
}
}
}
計時器正在毫無問題地發布到預熱視圖,但是當 timerMode 更新為 .work (具有幾乎相同的代碼)並且視圖發生更改時,計時器將停止發布。
就像將 WarmupView 中的WarmupView
@Binding var timer
類型更改為Publishers.Autoconnect<Timer.TimerPublisher>
。 .autoconnect()
將計時器發布者包裝在另一個發布者中,這會更改類型。
這是您的代碼的簡化版本:
struct ContentView: View {
let timer = Timer.publish(every: 1, on: .main, in: .common).autoconnect()
@State var remaining = 100
var body: some View {
Text("\(remaining)")
.font(.system(size: 160))
.onReceive(timer) { _ in
if self.remaining > 0 {
self.remaining -= 1
}
}
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.