首页 > 解决方案 > 如何在 SwiftUI 中延迟 @State 变量的设置值

问题描述

我想创建一个带有日期选择器的应用程序。日期选择器 ( ) 的初始值startDate需要在另一个类中执行一些计算。(例如,假设此日期最初设置为客户在服务中的注册日期,该日期是从数据库中检索的。)用户可以保留该日期原样,或使用日期选择器选择新日期。

我一直无法找到设置此初始值的方法。下面的简化代码说明了这个问题。日期选择器显示今天日期的初始值,而不是所需日期(此处为Date.distantPast.)。否则日期选择器可以正常工作。

我尝试过的事情:

有没有办法将日期选择器中的初始日期选择的设置推迟到可以计算出来?

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
    }
}

标签: swiftswiftuidatepicker

解决方案


您可以创建一个 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.


推荐阅读