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

如何无需滚动UIDatePicker选择器即可选中当前时间

问题原因

你目前的实现存在两个核心问题:

  • UIDatePicker初始化后没有主动将初始值同步到文本控件,valueChanged事件只有用户手动滚动选择器时才会触发,用户不滚动直接点击Done按钮就不会触发回调更新文本
  • Done按钮的点击事件中没有主动读取选择器当前的时间值,完全依赖滚动触发的回调传值
修复方案

1. 修改日期选择器初始化逻辑

初始化时主动设置默认时间为当前时间,同时主动触发一次值变更回调,把默认时间同步到展示文本:

func openDatePickerView(){
    datePicker = UIDatePicker.init()
    datePicker.autoresizingMask = .flexibleWidth
    datePicker.datePickerMode = .time
    // 新增:设置默认时间为当前时间,可根据需要替换为你需要的默认日期
    datePicker.date = Date()
    // 可选:设置时区避免时间偏差
    datePicker.timeZone = TimeZone.current
    if #available(iOS 13.4, *) {
        datePicker.preferredDatePickerStyle = .wheels
        datePicker.backgroundColor = UIColor.white
    } else {
        // Fallback on earlier versions
    }
    datePicker.addTarget(self, action: #selector(self.dateChanged(_:)), for: .valueChanged)
    datePicker.frame = CGRect(x: 0.0, y: UIScreen.main.bounds.size.height - 300, width: UIScreen.main.bounds.size.width, height: 300)
    self.view.addSubview(datePicker)
    toolBar = UIToolbar(frame: CGRect(x: 0, y: UIScreen.main.bounds.size.height - 300, width: UIScreen.main.bounds.size.width, height: 50))
    toolBar.barStyle = .default
    toolBar.items = [UIBarButtonItem(barButtonSystemItem: .flexibleSpace, target: nil, action: nil), UIBarButtonItem(title: "Done", style: .done, target: self, action: #selector(self.onDoneButtonClick))]
    toolBar.sizeToFit()
    self.view.addSubview(toolBar)
    // 新增:初始化完成后主动调用一次回调,同步默认时间到文本
    dateChanged(datePicker)
}

2. 补全Done按钮点击逻辑

在Done按钮的点击方法中主动读取选择器当前的时间值,即使用户没有滚动选择器也能拿到当前选中的时间:

@objc func onDoneButtonClick() {
    // 读取当前选择器的时间赋值
    let dateFormatter = DateFormatter()
    dateFormatter.dateFormat = "HH:mm"
    reminderLbl.text = dateFormatter.string(from: datePicker.date)
    // 原有逻辑:收起选择器等
    toolBar.removeFromSuperview()
    datePicker.removeFromSuperview()
}
可选优化

可以把日期格式化器提取为全局属性,避免每次回调都重复创建,提升性能:

// 类的全局属性
private let dateFormatter: DateFormatter = {
    let formatter = DateFormatter()
    formatter.dateFormat = "HH:mm"
    formatter.timeZone = TimeZone.current
    return formatter
}()

之后dateChanged和onDoneButtonClick方法里直接用这个全局的格式化器即可。

内容的提问来源于stack exchange,提问作者Poornima Mishra

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 03:24:03