首页 > 解决方案 > 设置日期和时间不显示在 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, y: 0.0, width: screenWidht, 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 中的当前(旧)日期,而不是我设置的日期和时间。有人可以帮助我吗?提前致谢!

标签: swiftuitextfielduidatepicker

解决方案


我已经更改了您代码中的某些代码行,请查看并尝试一下。我拿了一个文本字段,该文本字段的名称是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, y: 0.0, width: screenWidht, height: 44.0))
        let barButton = UIBarButtonItem(title: "Done", style: .plain, target: target, action: selector)
        toolBar.setItems([barButton], animated: false)
        self.inputAccessoryView = toolBar
    }}

推荐阅读