Swift 3以编程方式设置Datepicker的日期范围

时间:2018-07-15 03:24:02

标签: swift datepicker max minimum

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

代码如下。

notifyDataSetChanged()

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

非常感谢!

2 个答案:

答案 0 :(得分:0)

看来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])
}

答案 1 :(得分:0)

    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