SwiftUI 从 ViewModel 预填充 TextField
SwiftUI pre fill TextField from ViewModel
我有一个名为 UserService
的视图模型。假设这存储了所有用户数据,并在 Firestore 中更改数据时自动更新。
然后我有一个名为 phone
的 TextField
视图。这用作获取用户 phone 号码的输入。
此视图也有一个 ViewModel,此 vm 包含 TextField 使用的 @Published var phone: String = ""
属性。
问题是,除了使用此 TextField
更新值外,我还希望它显示来自 UserService
.[ 的当前值=28=]
我不知道如何将此数据从 UserService
传递到 TestViewModel
。如果将 UserService
放入 TestViewModel
,则 属性 不会实时更新,因为 SwiftUI 尚不支持 vm inside vm。现在我得到了两个独立的属性。 UserService
中的 phone
和 TestViewModel
中的 phone
。
我想过在 init() (TestViewModel
) 中手动更新 phone
,但我不确定这是否是正确的方法,因为我有 [以外的其他属性=13=]
我怎样才能达到这样的目的?
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
}
}
我有一个名为 UserService
的视图模型。假设这存储了所有用户数据,并在 Firestore 中更改数据时自动更新。
然后我有一个名为 phone
的 TextField
视图。这用作获取用户 phone 号码的输入。
此视图也有一个 ViewModel,此 vm 包含 TextField 使用的 @Published var phone: String = ""
属性。
问题是,除了使用此 TextField
更新值外,我还希望它显示来自 UserService
.[ 的当前值=28=]
我不知道如何将此数据从 UserService
传递到 TestViewModel
。如果将 UserService
放入 TestViewModel
,则 属性 不会实时更新,因为 SwiftUI 尚不支持 vm inside vm。现在我得到了两个独立的属性。 UserService
中的 phone
和 TestViewModel
中的 phone
。
我想过在 init() (TestViewModel
) 中手动更新 phone
,但我不确定这是否是正确的方法,因为我有 [以外的其他属性=13=]
我怎样才能达到这样的目的?
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
}
}