繁体   English   中英

在 SwiftUI MVVM 中的子视图和父视图之间共享值

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM