Представьте, что у меня есть представление с некоторым изменяемым состоянием, но может потребоваться обновить состояние, чтобы отразить изменения в другом объекте (например, ViewModel
).
Как я могу реализовать это в SwiftUI?
Я пробовал следующее, но не могу получить представление, отображающее обновления, поступающие от ViewModel
:
class ViewModel: ObservableObject {
@Published var text: String = "loading"
private var task: AnyCancellable?
func fetch() {
task = Just("done")
.delay(for: 1, scheduler: RunLoop.main)
.assign(to: \.text, on: self)
}
}
struct ContentView: View {
@ObservedObject var viewModel = ViewModel()
@State var viewText = "idle"
private var bind: AnyCancellable?
init() {
viewText = viewModel.text
bind = viewModel
.$text
.print()
.assign(to: \.viewText, on: self)
}
var body: some View {
VStack {
TextField(titleKey: "editable text", text: $viewText)
Text(viewText)
Text(viewModel.text)
}
.onAppear {
self.viewModel.fetch()
}
}
}
TextField
и первого Text
элемента получить их содержимое от ContentView.viewText
, второй Text
отправляется непосредственно к источнику: ViewModel.text
.
Как и ожидалось, второй Text
показывает "loading"
, а затем "done"
. Первый Text
никогда не меняется с "idle"
.