You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 04:33:37