SwiftUI 从 ViewModel 预填充 TextField
Posted
技术标签:
【中文标题】SwiftUI 从 ViewModel 预填充 TextField【英文标题】:SwiftUI pre fill TextField from ViewModel 【发布时间】:2021-03-07 17:34:15 【问题描述】:我有一个名为UserService
的视图模型。假设这会存储所有用户数据,并且会在 Firestore 中的数据发生更改时自动更新。
然后我有一个名为TextField
的视图phone
。这用作获取用户电话号码的输入。
这个视图也有一个 ViewModel,这个 vm 包含 TextField 使用的 @Published var phone: String = ""
属性。
问题在于,除了使用 TextField
更新值之外,我还希望它显示来自 UserService
的当前值。
我不知道如何将这些数据从UserService
传递给TestViewModel
。如果将 UserService
放入 TestViewModel
中,则属性不会实时更新,因为 SwiftUI 中尚不支持 vm inside vm。现在我已经结束了两个独立的属性。 phone
内 UserService
和 phone
内 TestViewModel
。
我曾想过在 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()
//
【问题讨论】:
【参考方案1】:一种可能的方法是在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
【讨论】:
以上是关于SwiftUI 从 ViewModel 预填充 TextField的主要内容,如果未能解决你的问题,请参考以下文章
使用 SwiftUI 2.0 和 Core Data 预填充数据
在 EditView 中使用 CoreData 中的值预填充 SwiftUI 表单
SwiftUI:从 ViewModel 更改视图 @State 属性
SwiftUI:如何从 ViewModel 的更改中切换警报演示者