【问题标题】:How to pass the date picker (or just the date) to show the date on textfield in Swift?如何传递日期选择器(或只是日期)以在 Swift 的文本字段上显示日期?
【发布时间】:2017-12-13 13:08:46
【问题描述】:

我想在键盘上显示日期选择器视图。我正在使用 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(或只是日期)在文本字段上显示日期,但我收到此错误:

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

我该如何解决这个问题?

【问题讨论】:

    标签: ios swift datepicker


    【解决方案1】:

    您应该简单地继承 UITextField 并将您的日期选择器声明为您的 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)
        }
    }
    

    【讨论】:

    • 链接的问题是重复的。 OP 打破了如何指定目标/动作选择器的规则
    • 是,但链接的问题中没有解决方案
    【解决方案2】:

    不能通过选择器传递额外的参数。为什么要将日期选择器传递给

    @objc func doneDatePicker(_ datePicker: UIDatePicker)
    

    替换

     let datePicker = UIDatePicker()
    

     var datePicker: UIDatePicker! 
    

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

    【讨论】:

    • 但是我使用 UITextField 扩展来做这个,然后我不能声明一个全局变量,因为扩展可能不包含存储的属性。有什么建议吗?
    • 在 showDatePicker() 中将参数作为 datePicker 传递。 showDatePicker(datePicker: UIDatePicker)
    • 然后在VC里面调用textField.showDatePicker(datePicker: datePicker)
    • showDatePicker 函数是正确的,我的问题是当我点击“Pronto”按钮设置文本字段文本时,我无法将日期选择器传递给操作函数来管理它。跨度>
    • @RahulDasgupta 你不应该建议 OP 在全局范围内声明他的对象。如果 OP 在他的 UI 中有很多日期字段怎么办?即使他的整个应用程序中只有一个日期字段,您也应该建议他创建一个共享实例单例类。
    猜你喜欢
    • 2013-04-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-27
    • 2012-10-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多