newbieHere
newbieHere

Reputation: 286

Why UIDatePicker fills two different TextFields same values

When I select values from UIDatePicker which shows after click on UITextField , my TextFields are filled out same values

override func viewDidLoad() {
        super.viewDidLoad()
        datepickerView = UIDatePicker()
        datepickerView?.datePickerMode = .time

        datepickerView?.addTarget(self, action: #selector(HomePageViewController.timeChangedForStartWork(datePicker:)), for: .valueChanged)

        datepickerView?.addTarget(self, action: #selector(HomePageViewController.timeChangedForEndWork(datePicker:)), for: .valueChanged)

        workHoursStartTextField.inputView = datepickerView
        workHoursEndTextField.inputView = datepickerView
}

@objc func timeChangedForStartWork(datePicker: UIDatePicker) {
        let dateFormatter = DateFormatter()
        dateFormatter.dateFormat = "HH:mm"
        workHoursStartTextField.text = dateFormatter.string(from: datePicker.date)
    }

@objc func timeChangedForEndWork(datePicker: UIDatePicker) {
        let dateFormatter = DateFormatter()
        dateFormatter.dateFormat = "HH:mm"
        workHoursEndTextField.text = dateFormatter.string(from: datePicker.date)

    }

Should I implement different datePicker for each TextField?

Upvotes: 0

Views: 46

Answers (1)

rmaddy
rmaddy

Reputation: 318954

You add two actions to the date picker. The same date picker is used for both text fields. So when the data picker value changes for either text field, both selectors are called. Since both selectors are called, both text fields get updated with the new value.

Just have one select. Just add one action to the date picker. Then in the one selector, update the text field that is currently the first responder.

override func viewDidLoad() {
    super.viewDidLoad()

    datepickerView = UIDatePicker()
    datepickerView?.datePickerMode = .time

    datepickerView?.addTarget(self, action: #selector(timeChanged), for: .valueChanged)

    workHoursStartTextField.inputView = datepickerView
    workHoursEndTextField.inputView = datepickerView
}

@objc func timeChanged(datePicker: UIDatePicker) {
    let dateFormatter = DateFormatter()
    dateFormatter.dateFormat = "HH:mm"
    let str = dateFormatter.string(from: datePicker.date)
    if workHoursStartTextField.isFirstResponder {
        workHoursStartTextField.text = str
    } else {
        workHoursEndTextField.text = str
    }
}

Upvotes: 3

Related Questions