21

Data Flow Through SwiftUI WWDC トークを見てきました。彼らは、SwiftUI ビューに接続され、UI を時間で更新するタイマー パブリッシャーを使用するサンプル コードを含むスライドを持っています。

私はまったく同じことをしたいコードに取り組んでいますが、これPodcastPlayer.currentTimePublisherがどのように実装され、UI 構造体にフックされているのかわかりません。また、Combine に関するすべてのビデオも見ました。

どうすればこれを達成できますか?

サンプルコード:

struct PlayerView : View {
  let episode: Episode
  @State private var isPlaying: Bool = true
  @State private var currentTime: TimeInterval = 0.0

  var body: some View {
    VStack { // ...
      Text("\(playhead, formatter: currentTimeFormatter)")
    }
    .onReceive(PodcastPlayer.currentTimePublisher) { newCurrentTime in
      self.currentTime = newCurrentTime
    }
  }
}
4

4 に答える 4

12

使用するObservableObject

Swift Combine を使用してタイマー パブリッシャーを作成するには

class TimeCounter: ObservableObject {
    @Published var time = 0
    
    lazy var timer = Timer.scheduledTimer(withTimeInterval: 1, repeats: true) { _ in self.time += 1 }
    init() { timer.fire() }
}

それでおしまい!変更を観察する必要があります。

struct ContentView: View {
    @StateObject var timeCounter = TimeCounter()
    
    var body: some View {
        Text("\(timeCounter.time)")
    }
}
于 2019-10-28T22:09:44.553 に答える
0

0 から 9 までのタイマー。

struct PlayerView : View {

    @State private var currentTime: TimeInterval = 0.0  
    @ObservedObject var player = PodcastPlayer()        
    var body: some View {      
        Text("\(Int(currentTime))")
            .font(.largeTitle)
            .onReceive(player.$currentTimePublisher.filter { $0 < 10.0 }) { newCurrentTime in
                self.currentTime = newCurrentTime
        }
    }
}
class PodcastPlayer: ObservableObject {

    @Published var currentTimePublisher: TimeInterval = 0.0     
    init() {
        Timer.scheduledTimer(withTimeInterval: 1.0, repeats: true) { _ in
            self.currentTimePublisher += 1
        }
    }
}
于 2020-09-03T21:48:44.213 に答える