gpt4 book ai didi

ios - 在 SwiftUI 中将计时器传递给 subview

转载 作者:行者123 更新时间:2023-12-01 21:45:46 25 4
gpt4 key购买 nike

在我的顶层 View 中,我声明了一个计时器,如下所示:

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

在 subview 中,我希望能够访问和更新这个计时器,它将作为唯一的真实来源。

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

计时器正在毫无问题地发布到预热 View ,但是当 timerMode 更新为 .work(具有几乎相同的代码)并且 View 发生变化时,计时器停止发布。

最佳答案

就像更改 @Binding var timer 的类型一样简单在你的WarmupViewPublishers.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
}
}
}
}

关于ios - 在 SwiftUI 中将计时器传递给 subview ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62275815/

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