![](/img/trans.png)
[英]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.