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。现在我已经结束了两个独立的属性。 phoneUserServicephoneTestViewModel

我曾想过在 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 的更改中切换警报演示者

SwiftUI MVVM 将变量从 ViewModel 传递到 API 服务

在 SwiftUI 组件之间共享 ViewModel