2

I have set up a date picker as input view of a textfield. Date picker has a minimum date and interval minute of 15. Now it gives proper date on changing the spin in value changed delegate. But if I don't spin the picker and tap done button with default first selected, it gives only current date. I would expect it to give me the date which is displayed by default in picker. Here is the code:

class ViewController: UIViewController {

    @IBOutlet weak var timeField: UITextField!

    var datePicker:UIDatePicker!

    override func viewDidLoad() {
        super.viewDidLoad()

    }

    @IBAction func CallPicker(sender: UITextField) {

        let datePickerView:UIDatePicker = UIDatePicker()
        datePickerView.datePickerMode = UIDatePickerMode.DateAndTime
        datePickerView.minuteInterval = 15
        datePickerView.minimumDate = NSDate()
        datePicker = datePickerView

        let toolBar = UIToolbar()
        toolBar.sizeToFit()
        let spaceButton = UIBarButtonItem(barButtonSystemItem: .FlexibleSpace, target: nil, action: nil)
        let doneButton = UIBarButtonItem(title: "Done", style: .Plain, target: self, action: "doneTapped")
        toolBar.setItems([spaceButton, doneButton], animated: false)
        toolBar.userInteractionEnabled = true

        sender.inputView = datePickerView
        sender.inputAccessoryView = toolBar
        datePickerView.addTarget(self, action: Selector("datePickerValueChanged:"), forControlEvents: UIControlEvents.ValueChanged)
    }

    func doneTapped() {
        let dateFormatter = NSDateFormatter()
        dateFormatter.dateStyle = .MediumStyle
        dateFormatter.timeStyle = .MediumStyle
        timeField.text = dateFormatter.stringFromDate(datePicker.date)
        timeField.resignFirstResponder()
    }

    func datePickerValueChanged(sender: UIDatePicker) {
        let dateFormatter = NSDateFormatter()
        dateFormatter.dateStyle = .MediumStyle
        dateFormatter.timeStyle = .MediumStyle
        timeField.text = dateFormatter.stringFromDate(sender.date)
    }

}

Scenario: suppose its 8:42 now. Date picker will show 8:30 as first entry but when I tap on done button, it will only give current time which is 8:42. However it works well if I roll spin and get back to first entry.

Vadim Kotov
  • 8,084
  • 8
  • 48
  • 62
Sanjay Pandey
  • 21
  • 1
  • 4

3 Answers3

0

Try using following code when date is selected

    let userDateFormate = NSDateFormatter()
    userDateFormate.dateFormat = "MMMM dd, yyyy"
    let dateString = userDateFormate.stringFromDate(date)

    dateFormate.dateFormat = "MMMM dd, yyyy"
    dateFormate.timeZone = NSTimeZone.init(forSecondsFromGMT: 0)
    let dateValue = dateFormate.dateFromString(dateString)
0

I also face the same issue and what I do for the workaround is to set a later time to my UIDatePicker with the help of Calender.current.dateComponents

func patchTime(){
    var components = Calendar.current.dateComponents([.hour, .minute], from: self.timePicker.date);
    components.hour = (components.hour ?? 0) + 1
    components.minute = 0

    let calendar = Calendar.current
    let date = calendar.date(from: components)
    self.timePicker.date = date!;

}

Currently I am using for timepicker but if needed for date also, the pattern will be same

user2672187
  • 21
  • 1
  • 3
-1

you just need to set the date property of this datePicker from current date to custom and then it will work.