Vikas
Vikas

Reputation: 1934

How to do validation on DatePicker?

I have **two date pickers from date and until date also two time Pickers from time and until time in my ViewController. I want to validate it like as** 1. If from and until date is same then until time is not less than from time.

second time should be greater than or equal to first time. Check the code below which is in my ViewController class.

    @IBOutlet weak var fromCalender: UITextField!
@IBOutlet weak var fromTime: UITextField!

@IBOutlet weak var untilTheCalender: UITextField!
@IBOutlet weak var untilTheTime: UITextField!

var fromDatePicker = UIDatePicker()
var fromTimePicker = UIDatePicker()
var untilTheDatePicker = UIDatePicker()
var untilTheTimePicker = UIDatePicker()@IBAction func fromCalenderDatePicker(_ sender: UITextField) {
    fromDatePicker.datePickerMode = .date
    sender.inputView = fromDatePicker
    fromDatePicker.minimumDate = Calendar.current.date(byAdding: .year, value: 0, to: Date())
    fromDatePicker.addTarget(self, action: #selector(handleFromCalenderDatePicker(sender:)), for: .valueChanged)
}

@objc func handleFromCalenderDatePicker(sender: UIDatePicker) {
    let dateFormatter = DateFormatter()
    dateFormatter.dateFormat = "dd MMM yyyy"
    fromCalender.text = dateFormatter.string(from: sender.date)
    untilTheDatePicker.minimumDate = sender.date
}

@IBAction func untilTheCalenderDatePicker(_ sender: UITextField) {
    untilTheDatePicker.datePickerMode = .date
    sender.inputView = untilTheDatePicker
    untilTheDatePicker.addTarget(self, action: #selector(untilTheCalenderDatePicker(sender:)), for: .valueChanged)
}

@objc func untilTheCalenderDatePicker(sender: UIDatePicker) {
    let dateFormatter = DateFormatter()
    dateFormatter.dateFormat = "dd MMM yyyy"
    untilTheCalender.text = dateFormatter.string(from: sender.date)
}

@IBAction func fromTimePicker(_ sender: UITextField) {
    fromTimePicker.datePickerMode = .time
    sender.inputView = fromTimePicker
    fromTimePicker.addTarget(self, action: #selector(handleTimePicker(sender:)), for: .valueChanged)
}

@objc func handleTimePicker(sender: UIDatePicker) {
    let timeFormatter = DateFormatter()
    timeFormatter.dateStyle = .none
    timeFormatter.timeStyle = .short
    timeFormatter.dateFormat = "HH:mm"
    fromTime.text = timeFormatter.string(from: sender.date)
    untilTheDatePicker.minimumDate = sender.date
}

@IBAction func untilTheTimePicker(_ sender: UITextField) {
    untilTheTimePicker.datePickerMode = .time
    sender.inputView = untilTheTimePicker
    untilTheTimePicker.addTarget(self, action: #selector(handleUntilTheTimePicker(sender:)), for: .valueChanged)
}

@objc func handleUntilTheTimePicker(sender: UIDatePicker) {
    let timeFormatter = DateFormatter()
    timeFormatter.dateStyle = .none
    timeFormatter.timeStyle = .short
    timeFormatter.dateFormat = "HH:mm"
    untilTheTime.text = timeFormatter.string(from: sender.date)
}

Please give me any solution to do this.

Upvotes: 0

Views: 1151

Answers (1)

Mohmmad S
Mohmmad S

Reputation: 5088

Inside the first UIDatePicker Delegate Method datePickerChanged you can use the sender.date as a minimumDate for the second UIDatePicker, Also add a default minimumDate to the second one same as the first one.

Your code should be something like this.

@objc func datePickerChanged(_ sender: UIDatePicker) {
fromCalender.text = dateFormatter.string(from: sender.date)

untilTheDatePicker. minimumDate = sender.date

}

For the .time pickers use the same approach as Date() already contains the Time components.

so just add .minimumDate = sender.date

Upvotes: 1

Related Questions