Если я правильно понимаю вашу проблему, вы не хотите, чтобы клавиатура появлялась, когда пользователь нажимает на текстовое поле, а должна появляться только тогда, когда пользователь нажимает кнопку «Клавиатура», и должна исчезать при нажатии другой кнопки.
Все опубликованные ответы в основном сосредоточены только на второй части отображения клавиатуры и их отклонения при нажатии кнопки. Что еще сложнее, так это предотвратить появление клавиатуры, когда пользователь нажимает на textField :)
Возможные решения, которые вы можете попробовать, и их недостатки:
Решение 1.
Попробуйте установить текстовое поле isEnabled = false
, чтобы убедиться, что это предотвратит появление клавиатуры, когда пользователь нажимает на текстовое поле, но угадайте, какая клавиатура не появится даже при вызове textfield.becomeFirstResponder()
аааа проблема :)
Решение 2.
реализуя textFieldShouldBeginEditing
делегата UITextField и возвращая true или false в зависимости от того, использовалась ли кнопка, нажатая на кнопку, или сам textField.
Конечно, это работает, но вам нужно будет выяснить, как сообщить textFieldShouldBeginEditing
, почему это было вызвано из-за кнопки или из-за сложностей с прикосновением к текстовому полю.
Мое решение:
Используйте 2 текстовых поля. Один отключает взаимодействие с пользователем навсегда и использует другое текстовое поле, которое никогда не будет отображаться для пользователя, но позаботится о отображении клавиатуры при необходимости.
Хватит разговоров, давайте код :)
Шаг 1:
Допустим, ваше текстовое поле, которое появляется на экране, называется textField
textfield.isEnabled = false
Это гарантирует, что все, что вы делаете, клавиатура не будет отображаться для этой клавиатуры.
Шаг 2:
Создайте временное текстовое поле нулевого кадра (которое пользователь никогда не сможет коснуться: P)
tempTextField = UITextField(frame: CGRect.zero)
tempTextField.delegate = self
self.view.addSubview(tempTextField)
Шаг 3.
Теперь, когда пользователь нажимает кнопку «Показать клавиатуру», сделайте свое временное текстовое поле первым ответчиком.
tempTextField.becomeFirstResponder()
и когда пользователь нажимает другую кнопку resignFirstResponder
для tempTextField.
tempTextField.resignFirstResponder()
Шаг 4:
Но подождите, когда пользовательский ввод ничего не появится в моем текстовом поле. Подождите, просто реализуйте
func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
if textField == tempTextField {
self.textfield.text = (self.textfield.text ?? "") + string
}
return true
}
ИЗМЕНИТЬ:
Вам действительно не нужны два текстовых поля, вы можете добиться того же с помощью UILabel
и UITextField
. Я выбрал UITextField, так как не знаю, какие у вас другие требования!
Проблема исправлена. Надеюсь, поможет :)
person
Sandeep Bhandari
schedule
16.11.2017