簡體   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