我想以编程方式创建一个日期选择器,范围从今天到6天,例如今天7/14,... 7/20。
代码如下。
notifyDataSetChanged()
日期选择器不仅显示7天,还显示过去的日期(例如7/12)和将来的日期(例如7/21)。有什么办法只显示7天?
非常感谢!
答案 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