我有一个名为UserService
的视图模型。假设它存储了所有的用户数据,当数据在Firestore中发生变化时,它会自动更新。
然后我有一个视图与TextField
称为phone
。它被用作获取用户电话号码的输入。
这个视图也有一个ViewModel,这个vm包含TextField使用的@Published var phone: String = ""
属性。
问题是,除了使用这个TextField
来更新值,我希望它也显示来自UserService
的当前值。
我不知道如何将这些数据从UserService
传递到TestViewModel
。如果将UserService
放到TestViewModel
中,属性将不会实时更新,因为在SwiftUI中还不支持vm中的vm。现在我已经结束了两个独立的属性。UserService
里的phone
,TestViewModel
里的phone
。
我想在init() (TestViewModel
)中手动更新phone
,但我不确定这是否正确,因为我有phone
以外的其他属性
我怎样才能做到这样呢?
struct User: Identifiable, Codable {
var phone: String
}
class UserService: ObservableObject {
@Published var user: User?
}
struct TestView: View {
@ObservedObject var testViewModel = TestViewModel()
@EnvironmentObject var userService: UserService
var body: some View {
Form {
Section(header: Text("PHONE NUMBER")) {
TextField("Phone number", text: $testViewModel.phone)
}
}
}
}
class TestViewModel: ObservableObject {
@Published var phone: String = ""
init() {
prefillForm()
}
func prefillForm() {
//
}
}
一种可能的方法是在onAppear
中初始化vm
,并在onChange
中同步回userSettings
,如
Section(header: Text("PHONE NUMBER")) {
TextField("Phone number", text: $testViewModel.phone)
.onAppear {
testViewModel.phone = userService.user?.phone ?? ""
}
.onChange(of: testViewModel.phone) { value in
userService.user?.phone = value
}
}