简体   繁体   English

SwiftUI:从 ViewModel 更改视图 @State 属性

[英]SwiftUI: Change view @State property from ViewModel

I have date picker in my view like this:我有这样的日期选择器:

struct BookTimeView: View {
    @ObservedObject var viewModel: BookTimeViewModel

    @State var startTime = Date.now
    
 
     var body: some View {
         DatePicker(“pick time”, selection: $startTime, displayedComponents: .hourAndMinute)
     }
}

initial startTime depends on data from backend.初始 startTime 取决于来自后端的数据。

So in view model I have API call that loads data from backend.因此,在视图 model 中,我有从后端加载数据的 API 调用。

In success callback I want to change startTime.在成功回调中,我想更改 startTime。

Question: How can I change startTime from my ViewModel?问题:如何从我的 ViewModel 更改 startTime?

PS: Is that possible to bind DatePicker with ViewModel directly? PS:可以直接将 DatePicker 与 ViewModel 绑定吗?

I tried to put @State var startTime = Date.now in view model.我试图将@State var startTime = Date.now放在视图 model 中。 But it doesn't work, and I see warning in Xcode:但它不起作用,我在 Xcode 中看到警告:

Accessing State's value outside of being installed on a View. This will result in a constant Binding of the initial value and will not update.

You can directly bind to the @Published property with just:您可以直接绑定到@Published属性,只需:

$viewModel.startTime

Which will be of type Binding<Date> , even though we declare it as just a @Published property on BookTimeViewModel .它将属于Binding<Date>类型,即使我们将其声明为BookTimeViewModel上的@Published属性。

Example code:示例代码:

class BookTimeViewModel: ObservableObject {
    @Published var startTime: Date = .now
}
struct BookTimeView: View {
    @ObservedObject var viewModel: BookTimeViewModel

    var body: some View {
        DatePicker("pick time", selection: $viewModel.startTime, displayedComponents: .hourAndMinute)
    }
}

Similar to my answer here .类似于我在这里的回答。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM