如何在 SwiftUI 中延迟 @State 变量的设置值
Posted
技术标签:
【中文标题】如何在 SwiftUI 中延迟 @State 变量的设置值【英文标题】:How to delay setting value of @State variable in SwiftUI 【发布时间】:2021-10-05 18:52:24 【问题描述】:我想创建一个带有日期选择器的应用程序。日期选择器的初始值 (startDate
) 需要在另一个类中执行一些计算。 (例如,假设此日期最初设置为客户在服务中的注册日期,该日期是从数据库中检索的。)用户可以保留该日期,或使用日期选择器选择新日期。
我还没有找到设置这个初始值的方法。下面的简化代码说明了这个问题。日期选择器显示今天日期的初始值,而不是所需日期(此处为Date.distantPast
)。否则日期选择器可以正常工作。
我尝试过的事情:
如果我在init
子句中设置了值(如下图),它会被忽略(没有报错,但是值没有写入startDate
变量)。
尝试将 startDate
的值与其声明内联会产生编译时错误消息(“不能在属性初始化程序中使用实例成员 '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
【问题讨论】:
【参考方案1】:您可以创建一个 ViewModel 来匹配您的视图。在 ViewModel 中你有更多的可能性。例如,您可以在 Init 中轻松初始化date
。
这看起来像这样:
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 是 ObservableObject
,并且可以更改的属性使用属性包装器 @Published
。
如果您的应用不再需要支持 ios 13,您也可以使用 @StateObject
代替 @ObservedObject
。
【讨论】:
非常感谢@Johannes。这非常有效。很抱歉,我没有足够的声望来支持我的投票。以上是关于如何在 SwiftUI 中延迟 @State 变量的设置值的主要内容,如果未能解决你的问题,请参考以下文章
我们如何从 SwiftUI 中的其他结构中读取 @State 变量?
如何在 SwiftUI 中使用 UIButton 更改 @State var