问题
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