繁体   English   中英

将计时器传递给 SwiftUI 中的子视图

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

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