【问题标题】:Swift 3 Set Date Range of Datepicker ProgrammaticallySwift 3 以编程方式设置 Datepicker 的日期范围
【发布时间】:2018-12-23 00:10:16
【问题描述】:

我想以编程方式创建一个日期选择器,范围从今天到 6 天后,例如今天,7/14,... 7/20。

代码如下。

self.datePickerView = UIDatePicker(frame: CGRect(x: 0, y: 50, width: UIScreen.main.bounds.width, height: 180))

if let datePickerView = self.datePickerView {
    let currentDate: Date = Date()

     datePickerView.calendar = NSCalendar.current
     datePickerView.timeZone = NSCalendar.current.timeZone

     var beginComponents = DateComponents()
     beginComponents.day = 0
     datePickerView.minimumDate = Calendar.current.date(byAdding: beginComponents, to: currentDate)

     var endComponents = DateComponents()
     endComponents.day = 6
     datePickerView.maximumDate = Calendar.current.date(byAdding: endComponents, to: currentDate)

     dateSelectorView.addSubview(datePickerView)
}

日期选择器不仅显示 7 天,还显示过去日期(例如 7/12)和未来日期(例如 7/21)。有没有办法只显示 7 天?

提前非常感谢!!!

【问题讨论】:

    标签: swift datepicker max minimum


    【解决方案1】:

    似乎无法更改UIDatePicker 我建议根据您的需要实施自定义UIPickerView

    Date 上创建一个扩展并添加一个新方法next(numberOfDays:from:) 和辅助方法nextSevenDays()

    extension Date { 
    
     static func nextSevenDays() -> [Date]{
       return Date.next(numberOfDays: 7, from: Date())
     }
    
     static func next(numberOfDays: Int, from startDate: Date) -> [Date]{
        var dates = [Date]()
        for i in 0..<numberOfDays {
            if let date = Calendar.current.date(byAdding: .day, value: i, to: startDate) {
            dates.append(date)
            }
        }
        return dates
        } 
    }
    

    viewController 内部设置一个数组来保存可能的日期并充当dataSource

     class ViewController: UIViewController, UIPickerViewDelegate, UIPickerViewDataSource { 
    
      @IBOutlet weak var datePicker: UIPickerView!
    
      let availableDates: [Date] = {
        return Date.nextSevenDays()
       }
    
      // You'll need a DateFormatter to 'pretty print' the dates to the pickerView labels.
      lazy var dateFormatter: DateFormatter = {
          let df = DateFormatter()
          df.dateFormat = "EEEE, MMMM, dd, YYYY"
          return df
       }()
    
    override func viewDidLoad() { 
     super.viewDidLoad() 
     self.datePicker.dataSource = self
     self.datePicker.delegate = self
    }
    
     //Required Methods for UIPickerViewDataSource & UIPickerViewDelegate 
    
    func numberOfComponents(in pickerView: UIPickerView) -> Int {
            return 1
        }
    
        func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {
            return self.avaliableDates.count
           }
    
    func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? {
        let label = dateFormatter.string(from: avaliableDates[row])
        return label
    }
    
    //Use this method to do work when a date is selected. 
    func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {
    
        print(avaliableDates[row])
    }
    

    【讨论】:

      【解决方案2】:
          var datePicker: UIDatePicker = UIDatePicker()
          datePicker?.datePickerMode = .date
          datePicker?.minimumDate = Date() // this to set the start date today
          //this to set the date range you can change " byAdding: .year " to "byAdding: .month" if you went the range by month or to "byAdding: .day"
          let nextDays = Calendar.current.date(byAdding: .year, value: 14, to: Date()) 
          datePicker?.maximumDate = nextDays ?? Date() // this to set the maximum date
      

      【讨论】:

        猜你喜欢
        • 2018-11-20
        • 2015-02-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-10-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多