【问题标题】:Set date and time is not displayed in textField / Swift设置日期和时间不显示在 textField / Swift
【发布时间】:2021-01-29 04:59:47
【问题描述】:

我创建了一个 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 中的当前(旧)日期,而不是我设置的日期和时间。有人可以帮助我吗?提前致谢!

【问题讨论】:

    标签: swift uitextfield uidatepicker


    【解决方案1】:

    我已经更改了您的代码中的一些代码行,请看一下并尝试一下。我拿了一个文本字段,该文本字段的名称是 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
        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
        }}
    

    【讨论】:

      【解决方案2】:

      你错过了将目标分配给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

      【讨论】:

      • 好的,但是现在每次我更改某些内容时,日期和时间选择器都会消失,即使我还没有完成。而 textField 只显示正确的日期而不是时间:(
      • @ChrisCode self.dateTextField.resignFirstResponder() 删除这一行
      • 或将您的操作从 .valueChanged 更改为 .editingDidEnd
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多