【问题标题】:SwiftUI pre fill TextField from ViewModelSwiftUI 从 ViewModel 预填充 TextField
【发布时间】: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() {
      //
    }
    
}

【问题讨论】:

    标签: ios swift xcode swiftui combine


    【解决方案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
            }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-04-24
      • 1970-01-01
      • 1970-01-01
      • 2020-05-06
      相关资源
      最近更新 更多