ios - 如何将 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)")
}
解决方案
你在做这么多事情。有简单的解决方案。使用阴影属性。
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
和视图来使用它。
推荐阅读
- css - Wordpress 菜单都是一种颜色。CSS似乎没有解决它
- javascript - 如何在html中的body和div元素之间没有空格
- python - 熊猫,按月排序并为每年创建新列
- decorator - 在 NestJS 中,如何在自定义方法装饰器中获取执行上下文或请求实例?
- python - 如何计算列中所有相同大小的重复值序列
- python - 为什么保存的文件显示无,而控制台显示正确的响应?
- python - 即使图像具有透明背景,MoviePy ImageSequenceClip 也不会创建具有透明背景的视频
- sql - Oracle REGEXP_SUBSTR 忽略字符的第一次出现但包括第二次出现
- php - 如何从运行 PHP 的 Google App Engine 安全访问 AWS RDS 数据
- python - 共享内存缓冲区的粒度锁定