24

I have a textfield and when it is selected a datepicker pops up instead of a keyboard, but it only updates with todays date the first time. The user changes the date, but the textfield does not continue to update. What is the problem?

This is how I call the Datepicker and control the date being inputted into my textfield:

 @IBAction func dp(sender: UITextField) {
    var DatePickerView  : UIDatePicker = UIDatePicker()
    DatePickerView.datePickerMode = UIDatePickerMode.Date
    textfieldjobdate.inputView = DatePickerView
    DatePickerView.addTarget(self, action: Selector("handleDatePicker"), forControlEvents: UIControlEvents.ValueChanged)    
}

func handleDatePicker() {
    var DatePickerView  : UIDatePicker = UIDatePicker()
    var dateFormatter = NSDateFormatter()
    dateFormatter.dateFormat = "dd MMM yyyy"
    textfieldjobdate.text = dateFormatter.stringFromDate(DatePickerView.date)
}
lesyk
  • 3,979
  • 3
  • 25
  • 39
agf119105
  • 1,770
  • 4
  • 15
  • 22

3 Answers3

65

Your handleDatePicker method is instantiating a new DatePicker each time it's called. You need to add a parameter to the function to pass in the sender (the DatePicker created in func dp)

@IBAction func dp(_ sender: UITextField) {
    let datePickerView = UIDatePicker()
    datePickerView.datePickerMode = .date
    sender.inputView = datePickerView
    datePickerView.addTarget(self, action: #selector(handleDatePicker(sender:)), for: .valueChanged)
}

@objc func handleDatePicker(sender: UIDatePicker) {
    let dateFormatter = DateFormatter()
    dateFormatter.dateFormat = "dd MMM yyyy"
    textfieldjobdate.text = dateFormatter.string(from: sender.date)
}
Ahmad F
  • 30,560
  • 17
  • 97
  • 143
Ashley Mills
  • 50,474
  • 16
  • 129
  • 160
  • Thanks for your answer, but I haven't been able to apply - just crashes the program. Also I had to change DatePicker to UIDatePicker, but it doesn't work - sorry. – agf119105 Jul 03 '14 at 11:57
  • The error it throws up is "unrecognised selector" do I have to modify func dp at all? – agf119105 Jul 03 '14 at 12:04
  • Yes, you have to use the correct selector for `handleDatePicker:` as this now takes a parameter. – Ashley Mills Jul 03 '14 at 12:21
  • that's what I don't know how to implement ... I put the colon in, but in obj C you used to use WithObject, but now? Can't seem to figure it out. How would I indicate the correct parameter? Thanks for your help, – agf119105 Jul 03 '14 at 12:30
  • The parameter is the sender, the object that sends the message. If you use `WithObject` (how?) to handle an action message from a `UIControl`, you were doing it wrong. – Ashley Mills Jul 03 '14 at 12:31
  • 1
    No problem - we got there in the end!! I updated my code to show what we discussed – Ashley Mills Jul 03 '14 at 12:51
  • I tried your same code. But when I click for first time my keyboard is appear and then from second time onwards the datePicker comes. @AshleyMills – Ronak Patel Nov 14 '19 at 04:47
0
    let selectedDate = datePicker.date
    print(selectedDate)
    let formatter = DateFormatter()
    formatter.dateFormat = "dd/MM/yyyy"
    let strDate = formatter.string(from: selectedDate)
    self.labelDate.text = strDate
Mr.Javed Multani
  • 12,549
  • 4
  • 53
  • 52
  • 1
    Although your code snippet might solve the issue, you should describe what’s the purpose of your code (how it solves the problem). Furthermore, you might want to check https://stackoverflow.com/help/how-to-answer – Ahmad F Mar 08 '18 at 09:23
-1
datePicker = UIDatePicker(frame:CGRect(x: 0, y: self.view.frame.size.height-180 , width: self.view.frame.size.width, height: 200))
    self.view.addSubview(datePicker)
    datePicker.datePickerMode = UIDatePickerMode.dateAndTime
    datePicker.isHidden = true
    button.isSelected = false
    datePicker.addTarget(self, action: #selector(self.dateSelected), for: UIControlEvents.valueChanged)

 @objc func dateSelected()
{
    let dateformatter1 = DateFormatter()
    dateformatter1.dateFormat = "ccc, d MMM yyy"

    let dateString1 = dateformatter1.string(from: datePicker.date)
    print("Date Selected \(dateString1)")
    labelDate.text = dateString1

    let dateformatter2 = DateFormatter()
    dateformatter2.dateFormat = "dd-MM-yyyy"
    let dateString2 = dateformatter2.string(from: datePicker.date)
    print("Date Selected \(dateString2)")


    let dateformatter3 = DateFormatter()
    dateformatter3.dateFormat = "dd/MM/yyyy"
    let dateString3 = dateformatter3.string(from: datePicker.date)
    print("Date Selected \(dateString3)")

    let dateformatter4 = DateFormatter()
    dateformatter4.dateFormat = "dd MMMM yyyy hh:mm a"
    let dateString4 = dateformatter4.string(from: datePicker.date)
    print("Date Selected \(dateString4)")

}

This article on DatePicker and NSDateFormat helped me a lot.

Manish Methani
  • 245
  • 2
  • 7