2017-02-09 5 views
1

Как узнать, есть ли клавиатура типа numeric, Twitter, электронная почта и т. Д.??iOS: Как получить текущий вид клавиатуры?

Редактировать: Есть ли способ обнаружить тип клавиатуры без использования розетки?

+0

Используйте свойство '.keyboardType'' UITextField' для определения типа. – iphonic

ответ

4

Считайте, что у вас есть буксирное TextFields в ViewController, Вам нужно будет реализовать textFieldShouldBeginEditing метод из UITextFieldDelegate протокола, следующим образом:

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! 
     } 
    } 
} 

Убедитесь, что их делегатов подключены к ViewController, программно:

tfEmail.delegate = self 
tfPassword.delegate = self 

или из Interface Builder.

Обратите внимание, что вы можете распознать тип клавиатуры для текущего TextField, проверяя его свойство keyboardType, который является экземпляром UIKeyboardType перечисления:

Тип клавиатуры для отображения для данного представления текста на основе. Используется с свойство keyboardType.

Что относительно UITextView?

точно такие же функции должны быть применен при работе с UITextViews, но вам нужно реализовать textViewDidBeginEditing(_:) метод из UITextViewDelegate протокола вместо реализации textFieldShouldBeginEditing. Опять же, убедитесь, что делегат textView подключен к ViewController.

Кроме того,

Если ваша главная цель проверки типа клавиатуры только для признания того, что в настоящее время ответил TextField/TextView, я предлагаю, чтобы сделать прямой контроль:

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 
     } 
    } 
} 

Для получения дополнительной информации об операторе === вы можете проверить this question/answers.

Надеюсь, это помогло.

+0

@ Xcoder123 благодарю вас за ваше примечание :) Я предполагаю, что это - как-то - должно привести к той же цели, OP, возможно, потребуется добавить некоторую логику для достижения определенной функциональности. –

+0

Да, я добавил эту логику в свой ответ :-), и я действительно хотел добавить эту логику для случая, когда клавиатура не видна ... И я думаю, что наличие отдельной функции добавляет простоту, потому что ее легче получить и немного более настраиваемый –

+0

Есть ли способ обнаружить тип клавиатуры без использования розетки? –

1

В дополнение к Ahmad F «s большой ответ, это мой подход получает текущий тип клавиатуры, в любое время:


Шаг 1: Делегат UITextField

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

Обновление viewDidLoad() к настоящему времени:

@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 
} 

Шаг 2: Работа с UITextField «s методы:

Добавить переменную keyboardType, как показано ниже:

var keyboardType: UIKeyboardType? = nil 

Затем изменить его всякий раз, когда новый textField начинает редактирование :

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

Шаг 3: Создание и вызова функции, как показано ниже:

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()) 
} 

И это выходы: email/number/no current keyboard/default, в зависимости от случая.

Если вы хотите, чтобы проверить, какой тип клавиатуры он с if-else заявления, вы можете изменить способ displayCurrentKeyboard() к этому:

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

И это все! Вы можете назвать это место, куда вы хотите в вашем коде с этим использованием:

let keyboardString = self.getCurrentKeyboard() 

ПРИМЕЧАНИЯ: Этот метод также обрабатывает случай без клавиатуры видимой на экране, возвращая no current keyboard, в этом случае.

Дайте мне знать, если это поможет!

Смежные вопросы