[英]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.