Swift: использование UIDatePicker в качестве UITextField inputView не обновляется

У меня есть текстовое поле, и когда он выбран, датапикер появляется вместо клавиатуры, но он только обновляется с датой в первый раз. Пользователь меняет дату, но текстовое поле не продолжает обновляться. В чем проблема?

Вот как я вызываю Datepicker и контролирую дату, введенную в мое текстовое поле:

 @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)
}

Ответы

Ответ 1

Ваш метод handleDatePicker создает новый экземпляр DatePicker каждом его вызове. Вам нужно добавить параметр в функцию для передачи в отправителя (DatePicker созданный в 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)
}

Ответ 2

Версия Swift 4.2

@IBAction func onEditDob(_ 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"
        dob.text = dateFormatter.string(from: sender.date)
}

Ответ 3

    let selectedDate = datePicker.date
    print(selectedDate)
    let formatter = DateFormatter()
    formatter.dateFormat = "dd/MM/yyyy"
    let strDate = formatter.string(from: selectedDate)
    self.labelDate.text = strDate

Ответ 4

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)")

}

Эта статья о DatePicker и NSDateFormat мне очень помогла.