Search code examples
swiftuitextfielduipickerview

Update UIPickerView rows when selecting new UITextField


I have created a pickerView that uses 3 different arrays to populate 3 textfields but when I tap on one textfield, select a row, and then directly tap another textfield, my pickerView does not update to the information in the array for that textfield.

If I tap on a textfield then tap away to dismiss the pickerview and then tap another textfield it updates and works fine.

var teams = [String]()
var schedules = ["A","B"]
var services = ["9AM","12PM","5PM"]
var pickerView:UIPickerView!

    override func viewDidLoad() {
        super.viewDidLoad()

        pickerView.delegate = self
        pickerView.dataSource = self

        teamTextField.inputView = self.pickerView
        serviceTextField.inputView = self.pickerView
        scheduleTextField.inputView = self.pickerView
    }

    func numberOfComponentsInPickerView(pickerView: UIPickerView) -> Int {
        return 1
    }

    func pickerView(pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {
        if teamTextField.isFirstResponder() {
            return teams.count
        }
        else if scheduleTextField.isFirstResponder() {
            return schedules.count
        }
        else  {
            return services.count
        }

    }

    func pickerView(pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? {
        if teamTextField.isFirstResponder() {
            return teams[row]
        }
        else if scheduleTextField.isFirstResponder() {
            return schedules[row]
        }
        else {
            return services[row]
        }
    }

    func pickerView(pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {
        if teamTextField.isFirstResponder() {
            let itemSelected = teams[row]
            teamTextField.text = itemSelected
        }
        else if scheduleTextField.isFirstResponder() {
            let itemSelected = schedules[row]
            scheduleTextField.text = itemSelected
        }
        else if serviceTextField.isFirstResponder() {
            let itemSelected = services[row]
            serviceTextField.text = itemSelected
        }

    }

    func textFieldDidBeginEditing(textField: UITextField) {
        pickerView.reloadAllComponents()
    }

That should be all the necessary code you need. If you need anything else, let me know.


Solution

  • Try to add this:

    @IBAction func textFieldDidBeginEditing(sender: AnyObject) {
        pickerView.reloadAllComponents()
    }
    

    and connect it to the 'Editing Did Begin' sent events of your UITextField's