【问题标题】:How to delay setting value of @State variable in SwiftUI如何在 SwiftUI 中延迟 @State 变量的设置值
【发布时间】: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
    }
}

【问题讨论】:

    标签: swift swiftui datepicker


    【解决方案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。这非常有效。很抱歉,我没有足够的声望来支持我的投票。
    猜你喜欢
    • 2019-10-28
    • 1970-01-01
    • 2019-11-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多