[英]SwiftUI MVVM: child view model re-initialized when parent view updated
[英]Share value between child and parent view in SwiftUI MVVM
我正在嘗試使用 SwiftUI 和 MVVM 架構編寫應用程序。 我了解當視圖 model 更改時視圖如何自動更新,但我不明白如何在父視圖中訪問該視圖 model。 例如,我有這個視圖,其中包含一個紅色背景的文本字段:
class CustomTextFieldViewModel: ObservableObject {
@Published var text: String = "abc"
}
struct CustomTextField: View {
@ObservedObject var viewModel: CustomTextFieldViewModel
var body: some View {
ZStack {
Color.red
.frame(height: 50)
TextField("Enter text...", text: $viewModel.text)
}
}
}
然后,我的主要內容視圖包含此 CustomTextField 的實例以及應該引用文本字段文本的 Text:
class ContentViewModel: ObservableObject {
@Published var textFieldModel = CustomTextFieldViewModel()
}
struct ContentView: View {
@ObservedObject var viewModel = ContentViewModel()
var body: some View {
VStack {
CustomTextField(viewModel: $viewModel.textFieldModel)
TextField("type", text: $viewModel.textFieldModel.text)
}
}
}
當我第一次啟動應用程序時,文本 label 確實顯示了“abc”的初始值,但是當我在文本字段中輸入時,它不會更新。 我怎樣才能“同步”這兩者?
這是修復
struct ContentView: View {
@ObservedObject var viewModel = ContentViewModel()
var body: some View {
VStack {
CustomTextField(viewModel: viewModel.textFieldModel) // << fix !!
Text("\(viewModel.textFieldModel.text)")
}
}
}
我最終通過這樣做來修復它:
class ContentViewModel: ObservableObject {
@Published var textFieldModel = CustomTextFieldViewModel()
}
struct ContentView: View {
@ObservedObject var viewModel = ContentViewModel()
var body: some View {
VStack {
CustomTextField(viewModel: $viewModel.textFieldModel)
Text("\($viewModel.textFieldModel.text.wrappedValue)") //<< wrappedValue
}
}
}
和
class CustomTextFieldViewModel: ObservableObject {
@Published var text: String = "abc"
}
struct CustomTextField: View {
@Binding var viewModel: CustomTextFieldViewModel //<< @Binding
var body: some View {
ZStack {
Color.red
.frame(height: 50)
TextField("Enter text...", text: $viewModel.text)
}
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.