设置的日期和时间不显示在 textField / Swift 中

问题描述

我创建了一个 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
    }}