【问题标题】:SwiftUI - how to observe(.sink/ .onReceive) PassthroughSubject inside a ViewSwiftUI - 如何在视图中观察(.sink/.onReceive)PassthroughSubject
【发布时间】:2022-11-27 06:53:45
【问题描述】:

如果您在编写应用程序时遇到以下任何限制:

  1. 您的 ViewModel 或模型的类型是 Struct 而不是类。这样你将无法使用 ObservableObject + ObservedObject。
  2. 还有第二个限制是避免在您的 ViewModel 或模型中使用属性包装器作为:@Binding 或 @Published。

    考虑下一个解决方案。

【问题讨论】:

    标签: ios swift swiftui combine


    【解决方案1】:

    如果您有一个作为模型或视图模型的结构,并且您需要在此处更新您的 SwiftUI 视图,这就是如何使用 SwiftUI + Combine 来做到这一点。

    import Combine
    
    struct ViewModel {
    
        var textChangedPublisher: AnyPublisher<String, Never> {
            textChangedSubject.eraseToAnyPublisher()
        }
        private let textChangedSubject = PassthroughSubject<String, Never>()
    
        func triggerUpdate() {
            let newStr = DateFormatter().string(from: Date())
            textChangedSubject.send(newStr)
        }
    
    }
    

    还有一个屏幕:

    import SwiftUI
    
    struct ContentView: View {
        
        private let vieModel = ViewModel()
        @State private var title = "Let's start"
        
        var body: some View {
            VStack {
                Text(title)
                Button.init("Show cuurent date") {
                    vieModel.triggerUpdate()
                }
                .onReceive(vieModel.textChangedPublisher) { newValue in
                    title = newValue
                }
            }
            .padding()
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-03-13
      • 1970-01-01
      • 2022-11-16
      • 1970-01-01
      • 1970-01-01
      • 2020-07-29
      • 1970-01-01
      相关资源
      最近更新 更多