iOS: How to get the current visible keyboard type?

99封情书 提交于 2019-12-07 18:02:26
Ahmad F

Consider that you have tow textFields in the ViewController, You will need to implement textFieldShouldBeginEditing method from UITextFieldDelegate protocol, as follows:

class ViewController: UIViewController, UITextFieldDelegate {
    @IBOutlet weak var tfEmail: UITextField!
    @IBOutlet weak var tfPassword: UITextField!

    func textFieldDidBeginEditing(_ textField: UITextField) {
        if textField.keyboardType == .emailAddress {
            // this is the tfEmail!
        }

        if textField.isSecureTextEntry {
            // this is tfPassword!
        }
    }
}

Make sure their delegates are connected to the ViewController, programmatically:

tfEmail.delegate = self
tfPassword.delegate = self

or from the Interface Builder.

Note that you can recognize the keyboard type for the current textField by checking its keyboardType property, which is an instance of UIKeyboardType enum:

The type of keyboard to display for a given text-based view. Used with the keyboardType property.

What about UITextView?

The same exact functionality should be applied when working with UITextViews, but you need to implement textViewDidBeginEditing(_:) method from UITextViewDelegate protocol instead of implementing textFieldShouldBeginEditing. Again, make sure the delegate of the textView is connected to the ViewController.

Also,

If your main purpose of checking the keyboard type is just for recognizing what is the current responded textField/textView, I suggest to do a direct check:

class ViewController: UIViewController, UITextFieldDelegate, UITextViewDelegate {
    @IBOutlet weak var tfEmail: UITextField!
    @IBOutlet weak var tfPassword: UITextField!
    @IBOutlet weak var textViewDescription: UITextView!

    override func viewDidLoad() {
        super.viewDidLoad()

        tfEmail.delegate = self
        tfPassword.delegate = self

        textViewDescription.delegate = self
    }

    func textFieldDidBeginEditing(_ textField: UITextField) {
        if textField === tfEmail {
            // this is the tfEmail!
        }

        if textField === tfPassword {
            // this is tfPassword!
        }
    }

    func textViewDidBeginEditing(_ textView: UITextView) {
        if textView === textViewDescription {
            // this is description textview
        }
    }
}

For more information about === operator you might want to check this question/answers.

Hope this helped.

In addition to Ahmad F 's great answer, this is my approach of getting the current keyboard type, at any time:


Step 1: Delegate UITextField

class File: UIViewController, UITextFieldDelegate{//...}

Update viewDidLoad() to this:

@IBOutlet weak var normalTextField: UITextField!
@IBOutlet weak var numberTextField: UITextField!
@IBOutlet weak var emailTextField: UITextField!

override func viewDidLoad() {
    super.viewDidLoad()
    numberTextField.keyboardType = .numberPad
    normalTextField.keyboardType = .default
    emailTextField.keyboardType = .emailAddress
    numberTextField.delegate = self
    normalTextField.delegate = self
    emailTextField.delegate = self
}

Step 2: Working with UITextField's methods:

Add a variable called keyboardType, as below:

var keyboardType: UIKeyboardType? = nil

Then, change it whenever a new textField begins editing:

func textFieldDidBeginEditing(_ textField: UITextField) {
        keyboardType = textField.keyboardType
}
func textFieldShouldEndEditing(_ textField: UITextField) -> Bool {
        keyboardType = nil
        return true
}

Step 3: Create and call a function like below:

func getCurrentKeyboard() -> String{
    if keyboardType == nil{
        return "no current keyboard"
    }
    else if keyboardType == .numberPad{
        return "number"
    }
    else if keyboardType == .emailAddress{
        return "email"
    }
    else{
        return "default"
    }
}

@IBAction func displayCurrentKeyboard(_ sender: UIButton) {
       print(self.getCurrentKeyboard())
}

And this outputs: email / number / no current keyboard / default, depending on the case.

If you want to check which type of keyboard it is with if-else statements, you can change your displayCurrentKeyboard() method to this:

@IBAction func displayCurrentKeyboard(_ sender: UIButton) {
      let keyboardString = self.getCurrentKeyboard()
      if keyboardString == "number"{
      //...
      }
      else if keyboardString == "email"{
      //...
      }
      else{
      //...
      }
}

And that's it! You can call this wherever you want in your code with this usage:

 let keyboardString = self.getCurrentKeyboard()

NOTE: This method also handles the case of no keyboard visible on the screen, returning no current keyboard, in this case.

Let me know if this helps!

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!