Venkatesh Chejarla
Venkatesh Chejarla

Reputation: 444

Using datePicker for multiple textfields in iOS swift

I am having 4 textFields where I have to set fromDate, fromTime and toDate, toTime for a userServiceBooking. Now, I need to fill these textFields with UIDatePicker and I am not able to show the text and I don't know why; maybe I am doing it totally wrong...

I am posting the code that I've tried and please someone look into it and tell how to do it.

Code:

import UIKit

class ConfirmRequestViewController: UIViewController,UITextFieldDelegate {

  @IBOutlet weak var fromDateTF: UITextField!
  @IBOutlet weak var toDateTF: UITextField!
  @IBOutlet weak var fromTimeTF: UITextField!
  @IBOutlet weak var toTimeTF: UITextField!
  var datePicker = UIDatePicker()
  var dateFormatter = DateFormatter()
  var toolBar = UIToolbar()

 override func viewDidLoad() {
        super.viewDidLoad()
 }

 func textFieldDidBeginEditing(_ textField: UITextField) {

        if textField == fromDateTF {

            datePicker.datePickerMode = .date
            fromDateTF.inputView = datePicker

            fromDateTF.text = dateFormatter.string(from: datePicker.date)

            toolBar.sizeToFit()

            let doneButton = UIBarButtonItem(barButtonSystemItem: .done, target: self, action: #selector(doneButtonTapped))
            toolBar.setItems([doneButton], animated: true)
            fromDateTF.inputAccessoryView = toolBar
        }
        if textField == toDateTF {

            datePicker.datePickerMode = .date
            toDateTF.inputView = datePicker

            toolBar.sizeToFit()

            let doneButton = UIBarButtonItem(barButtonSystemItem: .done, target: self, action: #selector(doneButtonTapped))
            toolBar.setItems([doneButton], animated: true)
            toDateTF.inputAccessoryView = toolBar
        }
        if textField == fromTimeTF {

            datePicker.datePickerMode = .time
            fromTimeTF.inputView = datePicker

            toolBar.sizeToFit()

            let doneButton = UIBarButtonItem(barButtonSystemItem: .done, target: self, action: #selector(doneButtonTapped))
            toolBar.setItems([doneButton], animated: true)
            fromTimeTF.inputAccessoryView = toolBar
        }
        if textField == toTimeTF {

            datePicker.datePickerMode = .time
            toTimeTF.inputView = datePicker

            toolBar.sizeToFit()

            let doneButton = UIBarButtonItem(barButtonSystemItem: .done, target: self, action: #selector(doneButtonTapped))
            toolBar.setItems([doneButton], animated: true)
            toTimeTF.inputAccessoryView = toolBar
        }
    }

    @objc func doneButtonTapped(textField: UITextField) {

        if textField == fromDateTF {

            dateFormatter.dateStyle = .medium
            dateFormatter.timeStyle = .none
            fromDateTF.text = dateFormatter.string(from: datePicker.date)
        }
        if textField == toDateTF {

            dateFormatter.dateStyle = .medium
            dateFormatter.timeStyle = .none
            toDateTF.text = dateFormatter.string(from: datePicker.date)
        }
        if textField == fromTimeTF {

            dateFormatter.dateStyle = .none
            dateFormatter.timeStyle = .medium
            fromTimeTF.text = dateFormatter.string(from: datePicker.date)
        }
        if textField == toTimeTF {

            dateFormatter.dateStyle = .none
            dateFormatter.timeStyle = .medium
            toTimeTF.text = dateFormatter.string(from: datePicker.date)
        }
        self.view.endEditing(true)
    }
 }

Upvotes: 2

Views: 4413

Answers (1)

Kuldeep
Kuldeep

Reputation: 4552

Try this.

override func viewDidLoad() {
    super.viewDidLoad()

    fromDateTF.inputView    = datePicker
    toDateTF.inputView      = datePicker
    fromTimeTF.inputView    = datePicker
    toTimeTF.inputView      = datePicker

    toolBar.sizeToFit()
    let doneButton = UIBarButtonItem(barButtonSystemItem: .done, target: self, action: #selector(doneButtonTapped))
    toolBar.setItems([doneButton], animated: true)
    fromDateTF.inputAccessoryView   = toolBar
    toDateTF.inputAccessoryView     = toolBar
    fromTimeTF.inputAccessoryView   = toolBar
    toTimeTF.inputAccessoryView     = toolBar
}


func textFieldDidBeginEditing(_ textField: UITextField) {
        if textField == fromDateTF {
            datePicker.datePickerMode = .date
        }
        if textField == toDateTF {
            datePicker.datePickerMode = .date
        }
        if textField == fromTimeTF {
            datePicker.datePickerMode = .time
        }
        if textField == toTimeTF {
            datePicker.datePickerMode = .time
        }
    }

@objc func doneButtonTapped() {
    if fromDateTF.isFirstResponder {
        dateFormatter.dateStyle = .medium
        dateFormatter.timeStyle = .none
        fromDateTF.text = dateFormatter.string(from: datePicker.date)
    }
    if toDateTF.isFirstResponder {
        dateFormatter.dateStyle = .medium
        dateFormatter.timeStyle = .none
        toDateTF.text = dateFormatter.string(from: datePicker.date)
    }
    if fromTimeTF.isFirstResponder {
        dateFormatter.dateStyle = .none
        dateFormatter.timeStyle = .medium
        fromTimeTF.text = dateFormatter.string(from: datePicker.date)
    }
    if toTimeTF.isFirstResponder {
        dateFormatter.dateStyle = .none
        dateFormatter.timeStyle = .medium
        toTimeTF.text = dateFormatter.string(from: datePicker.date)
    }
    self.view.endEditing(true)
}

Upvotes: 6

Related Questions