如何通过日期选择器(或只是日期)以Swift中的Textfield显示日期



我想在键盘上显示一个日期选择器视图。我正在使用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"按钮并执行功能donedatepicker时。我需要通过uidatePicker(或只是日期)以在Textfield上显示日期,但我会收到此错误:

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

如何解决此问题?

您应该简单地将uitextfield子列出,并将您的datepicker声明为uitextfield的属性,Override 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)
    }
}

无法通过选择器传递额外的参数。为什么您将日期选择器传递到

@objc func doneDatePicker(_ datePicker: UIDatePicker)

替换

 let datePicker = UIDatePicker()

 var datePicker: UIDatePicker! 

并将其作为单人类类中的共享实例。然后在功能中访问datepicker。

最新更新