如何通过dateselect器(或只是date)在Swift中显示文本字段的date?

我想在键盘上显示一个dateselect器视图。 我正在做这个使用UITextField扩展。

我的代码:

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

我的问题是当我点击“Pronto”button,并执行函数doneDatePicker。 我需要通过UIDatePicker(或只是date)来显示文本字段的date,但我得到这个错误:

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

我该如何解决这个问题?

您应该简单地inheritanceUITextField并将您的datepicker声明为您的UITextField的属性,重写didMoveToSuperview方法并在其中进行自定义:

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

不可能通过select器传递额外的参数。 为什么你要通过dateselect器

 @objc func doneDatePicker(_ datePicker: UIDatePicker) 

更换

  let datePicker = UIDatePicker() 

  var datePicker: UIDatePicker! 

并将其作为共享实例放在单例类中。 然后访问函数里面的datePicker。