Swift实现限未来7天的预约式自定义UIDatePicker技术求助
当然可行!这需求其实挺常见的,咱直接一步步来实现,代码都给你写清楚👇
完整实现方案
1. 配置UIDatePicker的日期范围
首先要让UIDatePicker只显示当前日期到未来7天的范围,这里得用Calendar来处理日期,避免时区或者跨月的问题。
import UIKit class AppointmentViewController: UIViewController { // 声明日期选择器 private let datePicker = UIDatePicker() override func viewDidLoad() { super.viewDidLoad() view.backgroundColor = .white // 1. 配置DatePicker setupDatePicker() // 2. 添加确认按钮 setupConfirmButton() } private func setupDatePicker() { datePicker.datePickerMode = .dateOnly // 只显示日期,不显示时间 datePicker.preferredDatePickerStyle = .inline // 基础内联样式,适配不同系统版本 // 设置最小日期为今天 let today = Date() datePicker.minimumDate = today // 设置最大日期为今天+7天 guard let sevenDaysLater = Calendar.current.date(byAdding: .day, value: 7, to: today) else { return } datePicker.maximumDate = sevenDaysLater // 添加到视图并布局 datePicker.translatesAutoresizingMaskIntoConstraints = false view.addSubview(datePicker) NSLayoutConstraint.activate([ datePicker.centerXAnchor.constraint(equalTo: view.centerXAnchor), datePicker.centerYAnchor.constraint(equalTo: view.centerYAnchor, constant: -50) ]) }
2. 添加确认按钮与预约逻辑
接下来加个基础按钮,用户选完日期点击后,弹出确认通知:
private func setupConfirmButton() { let confirmButton = UIButton(type: .system) confirmButton.setTitle("确认预约", for: .normal) confirmButton.titleLabel?.font = UIFont.systemFont(ofSize: 18, weight: .medium) confirmButton.addTarget(self, action: #selector(confirmAppointment), for: .touchUpInside) confirmButton.translatesAutoresizingMaskIntoConstraints = false view.addSubview(confirmButton) NSLayoutConstraint.activate([ confirmButton.topAnchor.constraint(equalTo: datePicker.bottomAnchor, constant: 30), confirmButton.centerXAnchor.constraint(equalTo: view.centerXAnchor) ]) } @objc private func confirmAppointment() { // 获取用户选择的日期 let selectedDate = datePicker.date // 格式化日期显示(可选,方便在弹窗里展示) let dateFormatter = DateFormatter() dateFormatter.dateStyle = .medium let dateString = dateFormatter.string(from: selectedDate) // 弹出预约确认通知 let alert = UIAlertController(title: "预约成功", message: "您已确认预约\(dateString)", preferredStyle: .alert) alert.addAction(UIAlertAction(title: "确定", style: .default)) present(alert, animated: true) } }
一些注意点
- 关于日期样式:如果是iOS 14+,
.inline样式是最基础友好的;如果要兼容更低版本,可以用.wheels样式,只需要把preferredDatePickerStyle改成.wheels就行。 - 日期计算用
Calendar而不是直接加时间戳,这样能自动处理闰年、跨月等特殊情况,避免bug。 - 弹窗用
UIAlertController是最基础的实现,如果想要系统通知栏的推送,也可以用UserNotifications框架,但你要的是弹出提示,这个基础弹窗完全够用。
把上面的代码直接放到你的ViewController里就能运行,UI都是基础样式,完全符合你的需求~
内容的提问来源于stack exchange,提问作者booak55
相关产品推荐
相关产品推荐

