问题描述
我创建了一个 UITextField 和一个 datePicker 作为 InputView。除了显示设置的日期和时间外,一切正常。
这是我的代码:
func setDatePickerAsInputView(target: Any,selector: Selector) {
let screenWidht = UIScreen.main.bounds.width
let datePicker = UIDatePicker(frame: CGRect(x: 0.0,y: 0.0,width: screenWidht,height: 300))
datePicker.datePickerMode = .dateAndTime
self.inputView = datePicker
let toolBar = UIToolbar(frame: CGRect(x: 0.0,height: 30.0))
self.inputAccessoryView = toolBar
}
func setUpDateTextField() {
//DateTextField
dateTextField.layer.cornerRadius = 25
dateTextField.layer.borderWidth = 2
dateTextField.textAlignment = .center
self.dateTextField.setDatePickerAsInputView(target: self,selector: #selector(dateSelected))
dateTextField.translatesAutoresizingMaskIntoConstraints = false
dateTextField.widthAnchor.constraint(equalToConstant: 200).isActive = true
dateTextField.heightAnchor.constraint(equalToConstant: 80).isActive = true
let formatter = DateFormatter()
formatter.dateStyle = .medium
formatter.timeStyle = .short
dateTextField.text = formatter.string(from: datePicker.date)
}
@objc func dateSelected() {
if let datePicker = self.dateTextField.inputView as? UIDatePicker {
let dateFormatter = DateFormatter()
dateFormatter.dateStyle = .medium
dateFormatter.timeStyle = .short
self.dateTextField.text = dateFormatter.string(from: datePicker.date)
dateTextField.text = "\(datePicker.date)"
}
self.dateTextField.resignFirstResponder()
}
但是如果我关闭 datePicker,它仍然是 TextField 中的当前(旧)日期,而不是我设置的日期和时间。有人可以帮我吗?提前致谢!
解决方法
您没有将目标分配给 UIDatePicker````. As you are passing target and selector but not assing to
UIDatePicker```
在 setDatePickerAsInputView
函数中添加这一行
datePicker.addTarget(target,action: selector,for: .valueChanged)
现在,每次更改值时都会调用 dateSelected
方法。因此,您需要从函数中删除此行 self.dateTextField.resignFirstResponder()
。或者您可以将操作从 .valueChanged
更改为 .editingDidEnd
我更改了您的代码中的一些代码行,请查看一下并尝试一下。我拿了一个文本字段,该文本字段的名称是 txt_Date
@IBOutlet weak var txt_Date: UITextField!
在viewDidLoad调用下面的函数
func setUpDateTextField() {
//DateTextField
txt_Date.layer.cornerRadius = 25
txt_Date.layer.borderWidth = 2
txt_Date.textAlignment = .center
self.txt_Date.setDatePickerAsInputView(target: self,selector: #selector(opneDatePicker))
txt_Date.translatesAutoresizingMaskIntoConstraints = false
txt_Date.widthAnchor.constraint(equalToConstant: 200).isActive = true
txt_Date.heightAnchor.constraint(equalToConstant: 80).isActive = true
}
日期选择器
的操作 @objc func opneDatePicker() {
if let datePicker = self.txt_Date.inputView as? UIDatePicker {
let dateformatter = DateFormatter()
dateformatter.dateStyle = .medium
dateformatter.dateFormat = "MMM d,yyyy HH:mm:ss"
self.txt_Date.text = dateformatter.string(from: datePicker.date)
}
self.txt_Date.resignFirstResponder() }
为了重用和减少 line 的代码,我对来自 UITextField
的 textfield 做了一个扩展 extension UITextField {
func setDatePickerAsInputView(target: Any,selector: Selector) {
let screenWidht = UIScreen.main.bounds.width
let datePicker = UIDatePicker(frame: CGRect(x: 0.0,y: 0.0,width: screenWidht,height: 300))
if #available(iOS 14,*) {
datePicker.preferredDatePickerStyle = .wheels
datePicker.sizeToFit()
}
self.inputView = datePicker
let toolBar = UIToolbar(frame: CGRect(x: 0.0,height: 44.0))
let barButton = UIBarButtonItem(title: "Done",style: .plain,target: target,action: selector)
toolBar.setItems([barButton],animated: false)
self.inputAccessoryView = toolBar
}}