3 текстовых поля, 1 pickerview, но при использовании pickerView выделение не отображается в текстовом поле

#ios #swift #xcode #uipickerview

#iOS #swift #xcode #uipickerview

Вопрос:

UIPickerView показывает данные, но не передает в UITextField .

я проверил другое сообщение, чтобы сравнить свой код, но все еще не могу найти решение. мы высоко ценим вашу помощь.

 import UIKit

class ViewController: UIViewController, UIPickerViewDataSource, UIPickerViewDelegate, UITextFieldDelegate {

    @IBOutlet weak var hospNameField: UITextField!
    @IBOutlet weak var teamNameField: UITextField!
    @IBOutlet weak var mdNameField: UITextField!
    @IBOutlet weak var selectionsPickerView: UIPickerView!

    var hosp = ["hosp1", "hosp2", "hosp3"]
    var team = ["team1", "team2", "team3"]
    var mds = ["MD1", "MD2", "MD3"]

    var itemSelected = ""
    var textFieldSelected = UITextField()

    weak var pickerView: UIPickerView?

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view.

        let pickerView = UIPickerView()
        pickerView.delegate = self
        pickerView.dataSource = self

        hospNameField.inputView = pickerView
        teamNameField.inputView = pickerView
        mdNameField.inputView = pickerView

        hospNameField.delegate = self
        teamNameField.delegate = self
        mdNameField.delegate = self

        self.pickerView = pickerView
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }

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

    func textFieldDidBeginEditing(_ textField: UITextField) {
        textFieldSelected = textField
    }

    func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {
        if hospNameField.isFirstResponder {
            return hosp.count
        } else if teamNameField.isFirstResponder {
            return team.count
        } else if mdNameField.isFirstResponder {
            return mds.count
        }
        return 0
    }

    func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? {
        if hospNameField.isFirstResponder {
            return hosp[row]
        } else if teamNameField.isFirstResponder {
            return team[row]
        } else if mdNameField.isFirstResponder {
            return mds[row]
        }
        return nil
    }

    func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {
        if teamNameField.isFirstResponder {
            let itemselected = hosp[row]
            hospNameField.text = itemselected
        } else if teamNameField.isFirstResponder {
            let itemselected = team[row]
            teamNameField.text = itemselected
        } else if mdNameField.isFirstResponder {
            let itemselected = mds[row]
            mdNameField.text = itemselected
        }
    }
}
  

Комментарии:

1. Я думаю weak var pickerView: UIPickerView? , что не должно быть слабой переменной, сохраните ее var pickerView: UIPickerView? . И нет смысла selectionsPickerView и textFieldSelected поэтому удалите их.

Ответ №1:

Вы забыли подписаться на делегата и источники данных в pickerView..

 import UIKit

class ViewController: UIViewController, UIPickerViewDataSource, UIPickerViewDelegate, UITextFieldDelegate {

    @IBOutlet weak var hospNameField: UITextField!
    @IBOutlet weak var teamNameField: UITextField!
    @IBOutlet weak var mdNameField: UITextField!
    @IBOutlet weak var selectionsPickerView: UIPickerView!

    var hosp = ["hosp1", "hosp2", "hosp3"]
    var team = ["team1", "team2", "team3"]
    var mds = ["MD1", "MD2", "MD3"]

    var itemSelected = ""
    var textFieldSelected = UITextField()

    weak var pickerView: UIPickerView?

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view.

        let pickerView = UIPickerView()
        pickerView.delegate = self
        pickerView.dataSource = self

        hospNameField.inputView = pickerView
        teamNameField.inputView = pickerView
        mdNameField.inputView = pickerView

        hospNameField.delegate = self
        teamNameField.delegate = self
        mdNameField.delegate = self

        self.pickerView = pickerView
        /**
         the below lines are mandatory for

         pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int)

         to execute
         */
        self.pickerView?.delegate = self
        self.pickerView?.dataSource = self
    }

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

    func textFieldDidBeginEditing(_ textField: UITextField) {
        textFieldSelected = textField
    }
    // add this delegate and reload here
  func textFieldShouldBeginEditing(_ textField: UITextField) ->
        Bool {
            self.pickerView?.reloadAllComponents()
            return true
    }

    func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {
        if hospNameField.isFirstResponder {
            return hosp.count
        } else if teamNameField.isFirstResponder {
            return team.count
        } else if mdNameField.isFirstResponder {
            return mds.count
        }
        return 0
    }

    func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? {
        if hospNameField.isFirstResponder {
            return hosp[row]
        } else if teamNameField.isFirstResponder {
            return team[row]
        } else if mdNameField.isFirstResponder {
            return mds[row]
        }
        return nil
    }

    func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {
        /**
         type here, need to check the responder for hospNameField also
         you have executed teamNameField.isFirstResponder twice
         */
        if hospNameField.isFirstResponder {
            let itemselected = hosp[row]
            hospNameField.text = itemselected
        } else if teamNameField.isFirstResponder {
            let itemselected = team[row]
            teamNameField.text = itemselected
        } else if mdNameField.isFirstResponder {
            let itemselected = mds[row]
            mdNameField.text = itemselected
        }
    }
}
  

Комментарии:

1. потрясающе, я смог устранить проблему. Я устал и не заметил dup.lol .. еще одна вещь, когда я меняю, скажем, hosp UITextField на team UITextField, pickerView не обновляется и показывает параметры перехода, но я все еще могу выбрать другую команду (надеюсь, я объясняю сам). в pickerView мне приходится прокручивать вверх и вниз несколько раз, чтобы показать другую переменную. Спасибо всем за вашу помощь!

2. Вы можете перезагрузить компоненты представления выбора, чтобы это сработало. Это можно сделать в делегате didBeginEditing текстового поля. Проверьте мой отредактированный ответ.

Ответ №2:

Я думаю, что ваш код ошибочен didSelectRow . проверьте первое и второе if , оба выполняют одно и то же условие.

 if teamNameField.isFirstResponder {
   let itemselected = hosp[row]
   hospNameField.text = itemselected
} else if teamNameField.isFirstResponder {
   let itemselected = team[row]
   teamNameField.text = itemselected
} else if mdNameField.isFirstResponder {
   let itemselected = mds[row]
   mdNameField.text = itemselected
}
  

Я думаю, вам следует изменить первое if на if hospNameField.isFirstResponder {..}