SwiftUI pre fill TextField from ViewModel



我有一个名为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
}
}

相关内容

  • 没有找到相关文章

最新更新