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