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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 06:38:58