Show UIPickerView text field is selected, then hide after selected
Swift 4 version
override func viewDidLoad() {
super.viewDidLoad()
pickerView.dataSource = self
pickerView.delegate = self
textField.delegate = self
textField.inputView = pickerView
}
And the extensions
// MARK: - UIPickerViewDelegate
extension ViewController: UITextFieldDelegate {
func textFieldShouldBeginEditing(_ textField: UITextField) -> Bool {
pickerView.isHidden = false
return false
}
}
// MARK: - UIPickerViewDelegate
extension ViewController: UIPickerViewDelegate, UIPickerViewDataSource {
func numberOfComponents(in pickerView: UIPickerView) -> Int {
return 1
}
func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {
return myItems.count
}
func pickerView( _ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? {
return myItems[row].name
}
func pickerView( _ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {
textField.text = myItems[row].name
pickerView.isHidden = true
}
}
If I understood well your question, you want:
- Have an
UITextField
which display a text selected - Opening a picker when the user click on the
UITextField
- Close the picker when an item (in the picker) is selected, and set it in the
UITextField
This is the complete code to manage it, you just have to link the delegate of your UITextField
:
@IBOutlet var textfieldBizCat: UITextField!
@IBOutlet var pickerBizCat: UIPickerView! = UIPickerView()
var bizCat = ["Cat One", "Cat Two", "Cat Three"]
override func viewDidLoad() {
super.viewDidLoad()
pickerBizCat.hidden = true;
textfieldBizCat.text = bizCat[0]
}
// returns the number of 'columns' to display.
func numberOfComponentsInPickerView(pickerView: UIPickerView!) -> Int{
return 1
}
// returns the # of rows in each component..
func pickerView(pickerView: UIPickerView!, numberOfRowsInComponent component: Int) -> Int{
return bizCat.count
}
func pickerView(pickerView: UIPickerView!, titleForRow row: Int, forComponent component: Int) -> String! {
return bizCat[row]
}
func pickerView(pickerView: UIPickerView!, didSelectRow row: Int, inComponent component: Int)
{
textfieldBizCat.text = bizCat[row]
pickerBizCat.hidden = true;
}
func textFieldShouldBeginEditing(textField: UITextField) -> Bool {
pickerBizCat.hidden = false
return false
}
What I changed from your code:
- Used
UITextFieldDelegate
to display the picker when theUITextField
is selected - Hide the picker once an item is selected, and setup the
UITextField
- Set the first row of your picker in the
UITextField
when any item is selected
How about in your didSelectRow method you resignFirstResponder?
func pickerView(pickerView: UIPickerView!, didSelectRow row: Int, inComponent component: Int)
{
textfieldBizCat.text = bizCat[row]
pickerBizCat.resignFirstResponder()
}