如何在 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 中的其他结构中读取 @State 变量?

SwiftUI @State 变量未更新

如何在 SwiftUI 中使用 UIButton 更改 @State var

如何将我的 SwiftUI 视图的 @State 交换为我的视图模型 @Published 变量?

值更改时如何在 UIKit 中更新 SwiftUI 视图?