首页 > 解决方案 > 如何将 datePicker 的显示设置为 AppStorage 时间(小时、分钟)设置?

问题描述

我试图让用户通过 datePicker 上的时间选择来选择他们希望通知在什么时间发出。我将 datePicker 设置为仅显示时间,如下所示:

DatePicker("First Workout Notification Time", selection: $firstNotificationTime, displayedComponents: .hourAndMinute)

我希望 firstNotificationTime @State var 使用我的 @AppStorage 时间变量,这些时间变量在此页面上的“var body:some View”上方设置为默认值:

@AppStorage("startNoficationHour") var startNoficationHour: Int = 9
@AppStorage("startNoficationMin") var startNoficationMin: Int = 30

当视图加载时(即 .onAppear(){}),我希望将 datePicker 的 $firstNotificationTime 设置为 startNoficationHour 和 startNoficationMin

我的观点设置如下:

var body: some View {
        VStack {
DatePicker("First Workout Notification Time", selection: $firstNotificationTime, displayedComponents: .hourAndMinute)
}
}
.onAppear(){
// set datePicker's fisrtNotificationTime to startNotificationHour and startNotificationMin
let components = DateComponents(calendar: Calendar.current, timeZone: TimeZone.current, hour:startNoficationHour, minute: startNoficationMin)
firstNotificationTime = components.date!        
                        print("start hour is \(startNoficationHour) and start minute is \(startNoficationMin)")
}
.onDisappear(){
// sets startNotificationHour and startNotificationMin to datePicker
                        let components = Calendar.current.dateComponents([.hour, .minute], from: firstNotificationTime)
                        startNoficationHour = components.hour!
                        startNoficationMin = components.minute!
                        print("start hour is set to \(startNoficationHour) and start minute is set to \(startNoficationMin)")
}

标签: iosiphonexcodeipadswiftui

解决方案


你在做这么多事情。有简单的解决方案。使用阴影属性。

Date有一种将时间转换为双精度值的方法。因此,您可以将双精度值存储到@AppStorage并使用它来更新日期。

这是一个例子,

创建一个@State日期变量,

@State var reminderTime = Date()

创建一个显示属性保存日期。

@AppStorage("reminderTime") var reminderTimeShadow: Double = 0

现在在DatePicker

 DatePicker("", selection: Binding(
                            get: {reminderTime}, set: {
                                reminderTimeShadow = $0.timeIntervalSince1970
                                reminderTime = $0
                                setNotification()
                            }), displayedComponents: .hourAndMinute)   
                    .onAppear {
                        reminderTime = Date(timeIntervalSince1970: reminderTimeShadow)
                    }

在这里,您使用显式绑定来获取和设置值,并且在设置提醒时间的值时,您还设置了值reminderTimeShadow并将其保存并@AppStorage通过.onAppear使用reminderTime = Date(timeIntervalSince1970: reminderTimeShadow)更新reminderTime和视图来使用它。


推荐阅读