How to pass the date picker (or just the date) to show the date on textfield in Swift?

十年热恋 提交于 2019-12-11 07:33:52

问题


I want show a date picker view on keyboard. I am doing this using UITextField extension.

My code:

extension UITextField {

//... other functions

func showDatePicker(){
    let datePicker = UIDatePicker()
    datePicker.datePickerMode = .date

    let toolbar = UIToolbar();
    toolbar.sizeToFit()

    let doneButton = UIBarButtonItem(title: "Pronto", style: UIBarButtonItemStyle.plain, target: self, action: #selector(UITextField.doneDatePicker(_:)))
    let spaceButton = UIBarButtonItem(barButtonSystemItem: UIBarButtonSystemItem.flexibleSpace, target: nil, action: nil)
    let cancelButton = UIBarButtonItem(title: "Cancelar", style: UIBarButtonItemStyle.plain, target: self, action: #selector(UITextField.donePicker))
    toolbar.setItems([cancelButton,spaceButton,doneButton], animated: false)

    self.inputAccessoryView = toolbar

    self.inputView = datePicker

}

@objc func doneDatePicker(_ datePicker: UIDatePicker){

    let formatter = DateFormatter()
    formatter.dateFormat = "dd/MM/yyyy"
    self.text = formatter.string(from: datePicker.date)
    self.endEditing(true)
}
}

My problem is when I tap "Pronto" button and the function doneDatePicker is executed. I need pass the UIDatePicker (or just the date) to show the date on textfield but I get this error:

Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[UIBarButtonItem date]: unrecognized selector sent to instance 0x103488850'

How can I solve this?


回答1:


You should simply subclass UITextField and declare your datepicker as a property of your UITextField, override didMoveToSuperview method and do the customisation there:

class DateField: UITextField {
    var date: Date?
    let datePicker = UIDatePicker()
    let formatter = DateFormatter()
    override func didMoveToSuperview() {
        datePicker.datePickerMode = .date
        formatter.dateStyle = .short
        let toolbar = UIToolbar()
        toolbar.sizeToFit()
        let done = UIBarButtonItem(title: "Pronto", style: .plain, target: self, action: #selector(doneAction))
        let space = UIBarButtonItem(barButtonSystemItem: .flexibleSpace, target: nil, action: nil)
        let cancel = UIBarButtonItem(title: "Cancelar", style: .plain, target: self, action: #selector(cancelAction))
        toolbar.setItems([cancel,space,done], animated: false)
        inputAccessoryView = toolbar
        inputView = datePicker
    }
    @objc func cancelAction(_ sender: UIBarButtonItem) {
        endEditing(true)
    }
    @objc func doneAction(_ sender: UIBarButtonItem) {
        date = datePicker.date
        text = formatter.string(from: datePicker.date)
        endEditing(true)
    }
}



回答2:


It is not possible to pass extra parameters through selectors. Why you are passing date picker to

@objc func doneDatePicker(_ datePicker: UIDatePicker)

Replace

 let datePicker = UIDatePicker()

with

 var datePicker: UIDatePicker! 

and put it as shared instance in a singleton class. then access datePicker inside the function.



来源:https://stackoverflow.com/questions/47793834/how-to-pass-the-date-picker-or-just-the-date-to-show-the-date-on-textfield-in

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!