如何无需滚动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
相关产品推荐
相关产品推荐

