无法将字符串转换为datePicker的日期

时间:2019-12-18 13:17:27

标签: ios swift datepicker date-formatting string-to-datetime

我尝试从文本字段中获取字符串,然后将其转换为日期,并将此值放入datepicker。但是由于某种原因,它每次都会失败,并且我得到:“ dateformatter中存在问题。无法将字符串转换为Date”。

我不明白我在做什么错以及如何解决这个问题。

我的代码:

import UIKit

class ViewController: UIViewController {

@IBOutlet weak var DOBTextField: UITextField!

override func viewDidLoad() {
    super.viewDidLoad()

    DOBTextField.addInputViewDatePicker(target: self, selector: #selector(doneButtonPressed), textFieldText: DOBTextField.text)
}

@objc func doneButtonPressed() {
    if let  datePicker = self.DOBTextField.inputView as? UIDatePicker {
        let dateFormatter = DateFormatter()
        dateFormatter.dateStyle = .long
        dateFormatter.timeStyle = .none
        self.DOBTextField.text = dateFormatter.string(from: datePicker.date)
    }
    self.DOBTextField.resignFirstResponder()
 }
}


 extension UITextField {

   func addInputViewDatePicker(target: Any, selector: Selector , textFieldText: String?) {


    let screenWidth = UIScreen.main.bounds.width

    let datePicker = UIDatePicker(frame: CGRect(x: 0, y: 0, width: screenWidth, height: 216))
    datePicker.datePickerMode = .date
    self.inputView = datePicker

    let dateFormatter = DateFormatter()
    dateFormatter.dateStyle = .long
    dateFormatter.timeStyle = .none

    if textFieldText != nil {
        if let date = dateFormatter.date(from: textFieldText!) {
            datePicker.date = date
        } else {
        print("There is issue in dateformatter. Not able to convert string to Date ")
        }
      }
     else {
      datePicker.date = Date()
    }


    //Add Tool Bar as input AccessoryView
    let toolBar = UIToolbar(frame: CGRect(x: 0, y: 0, width: screenWidth, height: 44))
    let flexibleSpace = UIBarButtonItem(barButtonSystemItem: .flexibleSpace, target: nil, action: nil)
    let cancelBarButton = UIBarButtonItem(title: "Cancel", style: .plain, target: self, action: #selector(cancelPressed))
    let doneBarButton = UIBarButtonItem(title: "Done", style: .plain, target: target, action: selector)
    toolBar.setItems([cancelBarButton, flexibleSpace, doneBarButton], animated: false)

    self.inputAccessoryView = toolBar
 }

   @objc func cancelPressed() {
     self.resignFirstResponder()
   }
}

我不明白我在做什么错以及为什么这段代码不起作用。也许有人可以帮助我解决这个问题?

3 个答案:

答案 0 :(得分:1)

正如我看到的那样,当您在addInputViewDatePicker上调用viewDidLoad时,textFieldText的值为"",这就是为什么您从头开始看到打印内容的原因

您可以尝试使用此代码(但我想可以对其进行优化):

import UIKit

class ViewController: UIViewController {

    @IBOutlet weak var DOBTextField: UITextField!

    override func viewDidLoad() {
        super.viewDidLoad()

        prepareDOBTextField()

        DOBTextField.addInputViewDatePicker(target: self, selector: #selector(doneButtonPressed), textFieldText: DOBTextField.text)
    }

    @objc func doneButtonPressed() {
        if let  datePicker = self.DOBTextField.inputView as? UIDatePicker {
            let dateFormatter = DateFormatter()
            dateFormatter.dateStyle = .long
            dateFormatter.timeStyle = .none
            self.DOBTextField.text = dateFormatter.string(from: datePicker.date)
        }
        self.DOBTextField.resignFirstResponder()
    }

    func prepareDOBTextField() {
        let date = Date()
        let formatter = DateFormatter()
        formatter.dateStyle = .long
        formatter.timeStyle = .none
        let result = formatter.string(from: date)

        self.DOBTextField.text = result
    }
}


extension UITextField {

    func addInputViewDatePicker(target: Any, selector: Selector , textFieldText: String?) {


        let screenWidth = UIScreen.main.bounds.width

        let datePicker = UIDatePicker(frame: CGRect(x: 0, y: 0, width: screenWidth, height: 216))
        datePicker.datePickerMode = .date
        self.inputView = datePicker

        let dateFormatter = DateFormatter()
        dateFormatter.dateStyle = .long
        dateFormatter.timeStyle = .none

        if textFieldText != nil && textFieldText != "" {
              if let date = dateFormatter.date(from: textFieldText!) {
                  datePicker.date = date
              } else {
                  print("There is issue in dateformatter. Not able to convert string to Date ")
              }
          }
          else {
              datePicker.date = Date()
          }

        //Add Tool Bar as input AccessoryView
        let toolBar = UIToolbar(frame: CGRect(x: 0, y: 0, width: screenWidth, height: 44))
        let flexibleSpace = UIBarButtonItem(barButtonSystemItem: .flexibleSpace, target: nil, action: nil)
        let cancelBarButton = UIBarButtonItem(title: "Cancel", style: .plain, target: self, action: #selector(cancelPressed))
        let doneBarButton = UIBarButtonItem(title: "Done", style: .plain, target: target, action: selector)
        toolBar.setItems([cancelBarButton, flexibleSpace, doneBarButton], animated: false)

        self.inputAccessoryView = toolBar
    }

    @objc func cancelPressed() {
        self.resignFirstResponder()
    }
}

答案 1 :(得分:0)

您可以按照下面的代码进行操作。

@objc func doneButtonPressed() {
   //Converting string to date
    let dateFormatter = DateFormatter()
    dateFormatter.dateFormat = "yyyy-MM-dd HH:mm"
    let date = dateFormatter.date(from: DOBTextField.text!)

    //Sets the date in the date picker
    datepicker.setDate(date!, animated: true)
}

因此,首先您要将文本字段(DOBTextField.text)转换为日期。

在将datePicker设置为正确的日期之后。

在这种情况下,您将必须在文本字段中完全像这样输入: “ 2019-12-18 14:50”

答案 2 :(得分:0)

解决了这个问题。我摆脱了扩展,在ViewController中为datepicker编写了代码。

import UIKit

class ViewController: UIViewController {

    @IBOutlet var textField: UITextField!

    let datePicker = UIDatePicker()

    override func viewDidLoad() {
        super.viewDidLoad()

        createDatePicker()
    }


    func createDatePicker() {
        textField.inputView = datePicker

        datePicker.datePickerMode = .date
        datePicker.maximumDate = Date()

        let toolbar = UIToolbar()
        toolbar.sizeToFit()

        let doneButton = UIBarButtonItem(barButtonSystemItem: .done, target: nil, action: #selector(doneClicked))
        let flexibleSpace = UIBarButtonItem(barButtonSystemItem: .flexibleSpace, target: nil, action: nil)

        toolbar.setItems([flexibleSpace, doneButton], animated: true)

        textField.inputAccessoryView = toolbar
    }

    @objc func doneClicked() {
        let dateFormatter = DateFormatter()
        dateFormatter.dateStyle = .long
        dateFormatter.timeStyle = .none

        textField.text = dateFormatter.string(from: datePicker.date)
        self.view.endEditing(true)

    }

}

在我添加到viewWillAppear之后,会显示datepicker的实际值:

   override func viewWillAppear(_ animated: Bool) {

                let dateFormatter = DateFormatter()
                dateFormatter.dateStyle = .long
                dateFormatter.timeStyle = .none
                datePicker.date = dateFormatter.date(from: textfield.text!)!
    }