简体   繁体   中英

hiding the keyboard when I used PickerView with textField

I want to realize one simple app, but I have some trouble. I add textField and PickerView. When I tab at textField, PickerView is appeared. But standard keyboard is appeared too (I dont want it). And when I again tab on textField, PickerView don't appear. How can I receive this problem? Thank's a lot!

This is my code:

    import UIKit

class ViewController: UIViewController, UIPickerViewDelegate, UIPickerViewDataSource, UITextFieldDelegate {

    @IBOutlet weak var pickerView1: UIPickerView!
    @IBOutlet weak var textField1: UITextField!

    var age = ["8", "18", "28", "38", "48"]

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

    func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {
        return age.count
    }

    func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? {
        if pickerView == pickerView1 {
        }
        return age[row]
    }

    func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {
        if pickerView == pickerView1 {
            self.textField1.text = self.age[row]
            self.pickerView1.isHidden = true
        }
    }

    func textFieldDidBeginEditing(_ textField: UITextField) {
        if textField == self.textField1 {
            self.pickerView1.isHidden = false
        }
    }

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
    }

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

why you are not try the simple way, just add your pickerview as inputview of your textfield

 textField1.inputView = pickerView1

This will not give you a direct way to dismiss the view since your UIPickerView has no return button, which is why I recommend to use the inputAccessoryView property to display a toolbar with a done button

  let myToolbar = UIToolbar(frame: CGRect(x: CGFloat(0), y: CGFloat(0), width: CGFloat(320), height: CGFloat(44)))
    //should code with variables to support view resizing
    let doneButton = UIBarButtonItem(barButtonSystemItem: .done, target: self, action: #selector(self.inputAccessoryViewDidFinish))
    //using default text field delegate method here, here you could call
    //myTextField.resignFirstResponder to dismiss the views
    myToolbar.setItems([doneButton], animated: false)
    lblcurrentText.inputAccessoryView = myToolbar

and call the function as

    func inputAccessoryViewDidFinish() {
    lblcurrentText.resignFirstResponder()
}

at the same time after selection on your pickerview hide the text field like

 func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {
    if pickerView == pickerView1 {
        self.textField1.text = self.age[row]
        self.inputAccessoryViewDidFinish()
    }
}

Tutorial

for example you can get the step by step tutorial in here

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM