ucelme
ucelme

Reputation: 97

Textfield and datepicker change values

I try to use this code to get date picker when clicking on a text field:

import UIKit

class ViewController: UIViewController {

@IBOutlet weak var DOBTextField: UITextField!

override func viewDidLoad() {
    super.viewDidLoad()

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

@objc func doneButtonPressed() {
    if let  datePicker = self.DOBTextField.inputView as? UIDatePicker {
        let dateFormatter = DateFormatter()
        dateFormatter.dateStyle = .none
        dateFormatter.timeStyle = .short
        dateFormatter.locale = Locale.init(identifier: "it_IT")
        self.DOBTextField.text = dateFormatter.string(from: datePicker.date)
    }
    self.DOBTextField.resignFirstResponder()
 }
}


 extension UITextField {

   func addInputViewDatePicker(target: Any, selector: Selector) {

    let screenWidth = UIScreen.main.bounds.width

    //Add DatePicker as inputView
    let datePicker = UIDatePicker(frame: CGRect(x: 0, y: 0, width: screenWidth, height: 216))
    datePicker.datePickerMode = .time
    datePicker.locale = Locale.init(identifier: "it_IT")
    self.inputView = datePicker

    //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()
   }
}

But when I click on text field again, time on date picker move forward on 3 dimensions. How this can be fixed? I want time on date picker to rest the same as it is on text field.

enter image description here

I try to implement this code, but it crash:

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 = .none
        dateFormatter.timeStyle = .short
        dateFormatter.locale = Locale.init(identifier: "it_IT")
        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

    //Add DatePicker as inputView
    let datePicker = UIDatePicker(frame: CGRect(x: 0, y: 0, width: screenWidth, height: 216))
    datePicker.datePickerMode = .time
    datePicker.locale = Locale.init(identifier: "it_IT")
    self.inputView = datePicker

    if textFieldText != nil {
        /// Set Textfield date & time
          let dateFormatter = DateFormatter()
          dateFormatter.dateStyle = .none
          dateFormatter.timeStyle = .short
          dateFormatter.locale = Locale.init(identifier: "it_IT")
          datePicker.date = dateFormatter.date(from: textFieldText!)!
      }
     else {
      /// set current date & time
      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()
   }
}

How this can be fixed?

Upvotes: 0

Views: 1723

Answers (2)

ucelme
ucelme

Reputation: 97

It seems this problem only appears on simulators. When I try to test this code on real device everything works fine. May be it's just Xcode bug.

Upvotes: 0

Abhishek Patel
Abhishek Patel

Reputation: 127

As per I understand, You want to textfield's time when datepicker opens. You just have to set date for DatePicker when it will be initialized.

Set DatePicker's date :

extension UITextField {

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


//Add DatePicker as inputView

//Set date for date Picker
  if textFieldText != nil {
      /// Set Textfield date & time
        let dateFormatter = DateFormatter()
        dateFormatter.dateStyle = .none
        dateFormatter.timeStyle = .short
        dateFormatter.locale = Locale.init(identifier: "it_IT")
        datePicker.date = dateFormatter.date(from: textFieldText!)!
    }
   else {
    /// set current date & time
    datePicker.date = Date()
  }

     //Add Tool Bar as input AccessoryView
  }
}

Change in your viewDidLoad:

override func viewDidLoad() {
    super.viewDidLoad()

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

I hope you understand what you have to set with datepicker. If this code is not working as you want then take Action of textfield (Editing Did Begin) & try to set textfield inputView in Action.

Upvotes: 1

Related Questions