SwiftUI -如何观察(.sink/ . onreceive) PassthroughSubject在一个视图内.&



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

  1. 你的ViewModel或Model的类型是Struct而不是Class。这样你就不能使用ObservableObject + ObservedObject。
  2. 第二个限制是避免在Struct中使用属性包装器:@Binding和@Published,因为它们很难定义为可选属性。
  3. 你不想要双向绑定,就像使用@State + @Binding那样。你想要打开-允许其他人观察更改,但被关闭-不允许其他人进行更改(UIKit中的委托模式,RXSwift中的发布模式,SwiftUI中的@StateObject,但仅限于类)。

你可以考虑下一个解决方案。

如果你有一个Struct作为Model或ViewModel,你需要在这里更新你的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()
}
}

相关内容

  • 没有找到相关文章

最新更新