swift - 如何在 SwiftUI 中延迟 @State 变量的设置值
问题描述
我想创建一个带有日期选择器的应用程序。日期选择器 ( ) 的初始值startDate
需要在另一个类中执行一些计算。(例如,假设此日期最初设置为客户在服务中的注册日期,该日期是从数据库中检索的。)用户可以保留该日期原样,或使用日期选择器选择新日期。
我一直无法找到设置此初始值的方法。下面的简化代码说明了这个问题。日期选择器显示今天日期的初始值,而不是所需日期(此处为Date.distantPast
.)。否则日期选择器可以正常工作。
我尝试过的事情:
- 如果我在
init
子句中设置了值(如下图),它会被忽略(没有报错,但是值没有写入startDate
变量)。 - 尝试在
startDate
其声明中设置 inline 的值会给出编译时错误消息(“不能在属性初始化程序中使用实例成员 'db';属性初始化程序在 'self' 可用之前运行”。) - 将 DataPicker 包装在 if 语句中,这样在计算之前不会显示
startDate
它没有区别。
有没有办法将日期选择器中的初始日期选择的设置推迟到可以计算出来?
import SwiftUI
struct ContentView: View {
private let db = DB()
@State private var startDate = Date()
var body: some View {
DatePicker("Start Date",
selection: $startDate,
displayedComponents: [.date])
}
init() {
startDate = db.theDate
}
}
struct ContentView_Previews: PreviewProvider {
static var previews: some View {
ContentView()
}
}
class DB {
var theDate: Date
init() {
theDate = Date.distantPast
}
}
解决方案
您可以创建一个 ViewModel 来匹配您的视图。在 ViewModel 中你有更多的可能性。例如,您可以轻松地date
在 Init 中进行初始化。
这看起来像这样:
class ContentViewModel: ObservableObject {
private let db = DB()
@Published var date: Date
init() {
date = db.theDate
}
}
struct ContentView: View {
@ObservedObject var viewModel = ContentViewModel()
var body: some View {
DatePicker("Start Date",
selection: $viewModel.date,
displayedComponents: [.date])
}
}
确保 ViewModel 是 anObservableObject
并且可以更改的属性使用属性包装器@Published
。
如果您的应用不再需要支持 iOS 13,您也可以@StateObject
使用@ObservedObject
.
推荐阅读
- spring-boot - spring 集成下使用 Paho 无法接收 MQTT 消息
- sbt - SBT 中已发布程序集包中未解决的依赖关系
- c# - List.Add() 覆盖了我以前的值
- ios - 如何获取 iOS 的蜂窝或 wifi 信号强度,尤其是 iPhone X?除了从系统状态栏获取它?
- laravel - Post notification redirect user to post id
- computer-vision - Is it possible to compute intrinsic and extrinsic camera parameters from a given camera projection matrix?
- python - 如何合并两个数据帧,以便一个数据帧中的每个值都使用 python 和 pandas 链接到另一个数据帧中的所有值
- javascript - Angular NodeJs Remove Item from res.json();
- reactjs - react-native 中条件渲染的最佳实践
- node.js - fs.writeFile 不写入文件,除非运行两次