如何让UIDatePicker显示用户选择的时间?附选择器与通知页面设置
嘿,这个问题我之前做每日通知功能的时候也踩过坑!其实核心就是要把用户选的时间持久化存起来,然后在通知设置页面加载的时候,把存好的时间赋值回UIDatePicker就行。结合你的场景,我给你拆解成几个关键步骤:
1. 用户选择时间后,立刻持久化存储
每次用户拖动UIDatePicker调整时间时,你需要把选中的date保存到本地。用UserDefaults就足够了,毕竟只是个轻量的偏好设置。
Swift 示例:
// 假设你的UIDatePicker IBOutlet叫timePicker @IBAction func timePickerValueChanged(_ sender: UIDatePicker) { // 把选中的时间存到UserDefaults UserDefaults.standard.set(sender.date, forKey: "DailyNotificationSelectedTime") }
Objective-C 示例:
- (IBAction)timePickerValueChanged:(UIDatePicker *)sender { [[NSUserDefaults standardUserDefaults] setObject:sender.date forKey:@"DailyNotificationSelectedTime"]; [[NSUserDefaults standardUserDefaults] synchronize]; }
2. 页面加载时,恢复保存的时间到Picker
当你的通知设置页面(比如对应的ViewController)初始化完成后,要从本地存储里取出之前保存的时间,赋值给UIDatePicker。如果是用户第一次打开页面,没有保存的时间,就设置一个合理的默认值(比如早上8点)。
Swift 示例:
override func viewDidLoad() { super.viewDidLoad() // 构建默认时间:今天的8点整 let calendar = Calendar.current let defaultTime = calendar.date(bySettingHour: 8, minute: 0, second: 0, of: Date())! // 从UserDefaults取保存的时间,没有就用默认值 let savedTime = UserDefaults.standard.object(forKey: "DailyNotificationSelectedTime") as? Date ?? defaultTime // 把时间赋值给UIDatePicker timePicker.date = savedTime }
Objective-C 示例:
- (void)viewDidLoad { [super viewDidLoad]; // 设置默认时间为当天8点 NSCalendar *calendar = [NSCalendar currentCalendar]; NSDate *defaultTime = [calendar dateBySettingHour:8 minute:0 second:0 ofDate:[NSDate date] options:0]; // 取出保存的时间,没有则用默认值 NSDate *savedTime = [[NSUserDefaults standardUserDefaults] objectForKey:@"DailyNotificationSelectedTime"] ?: defaultTime; // 赋值给UIDatePicker self.timePicker.date = savedTime; }
3. 结合本地通知的额外注意事项
既然是用来设置每日通知,还有两个点要注意:
- 用户修改时间后,一定要取消之前的旧通知,再根据新时间创建新的重复通知,不然会出现多个通知同时触发的情况。
- 确保你的应用已经获取了通知权限!可以在页面加载时主动请求权限:
UNUserNotificationCenter.current().requestAuthorization(options: [.alert, .sound, .badge]) { granted, error in if let error = error { print("请求通知权限失败:\(error.localizedDescription)") } // 如果权限已获取,后续就可以正常设置通知了 }
这样操作后,UIDatePicker就能每次打开都显示用户上次选择的时间,而且通知设置也能同步更新啦~
内容的提问来源于stack exchange,提问作者Anthony DeFallo
相关产品推荐
相关产品推荐

