Swift 4 - Как включить/отключить клавиатуру с помощью кнопок

Моя сложная проблема:

У меня есть 2 кнопки с 2 UITextView. Как вы знаете, когда я нажимаю UITextView, появляется клавиатура. Ну, это не то, чего я хочу.

Я хочу включить/отключить клавиатуру дисплея в соответствии с определенным записанным на пленку @IBAction.

Сценарий следующий: - Первая кнопка (значок клавиатуры) позволяет пользователю отображать клавиатуру для ввода чего-либо в одном из UITextView с инициализацией FirstResponder в верхней части.

  • Вторая кнопка (значок REC) позволяет пользователю говорить и отображать в предварительно выбранном TextView, но без отображения клавиатуры.

Я уже знаю, что есть:

isUserInteractionEnabled

а также

textViewDidBeginEditing

Но это не очень хорошо подходит и / или решает мою проблему.

Вот экран, чтобы быть более явным (не обращайте внимания на третью зеленую кнопку подтверждения, это только для функции .POST):

введите здесь описание изображения

Спасибо за любую помощь!


person Danyl    schedule 16.11.2017    source источник
comment
Вы имеете в виду отключение клавиатуры при нажатии других кнопок?   -  person John D    schedule 16.11.2017
comment
Учитывая, что выбран один из UITextView. Да, это то, что я хочу определенно. Я хочу отключить клавиатуру при нажатии определенной кнопки и заставить ее появляться при нажатии другой.   -  person Danyl    schedule 16.11.2017
comment
@danyl: Пожалуйста, взгляните на подробный ответ, который я опубликовал, с несколькими решениями, которые вы можете попробовать, и, наконец, с одним, который отлично работает: D   -  person Sandeep Bhandari    schedule 16.11.2017


Ответы (5)


Если я правильно понимаю вашу проблему, вы не хотите, чтобы клавиатура появлялась, когда пользователь нажимает на текстовое поле, а должна появляться только тогда, когда пользователь нажимает кнопку «Клавиатура», и должна исчезать при нажатии другой кнопки.

Все опубликованные ответы в основном сосредоточены только на второй части отображения клавиатуры и их отклонения при нажатии кнопки. Что еще сложнее, так это предотвратить появление клавиатуры, когда пользователь нажимает на 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
comment
@danyl: рад, что смог помочь :) Удачного кодирования :) - person Sandeep Bhandari; 17.11.2017

Что-то вроде этого должно работать:

class MyViewController: UIViewController, UITextViewDelegate {

    @IBOutlet var yourTextView: UITextView

        override func viewDidLoad() {
            super.viewDidLoad()

            yourTextView.delegate = self
        }

        @IBAction func showKeyboard(_ sender: UIButton) {
        self.yourTextView.becomeFirstResponder()

    }

      @IBAction func hideKeyboard(_ sender: UIButton) {
        self.yourTextView.resignFirstResponder()

    }

    }
person JP Aquino    schedule 16.11.2017

Ты говоришь

Но это не совсем работает в моем случае.

Почему?

Вы можете отключить взаимодействие с текстовыми полями с помощью (swift 3):

textField.isUserInteractionEnabled = false

Затем, когда вы нажимаете кнопку на клавиатуре, вы можете снова включить взаимодействие, поэтому, когда пользователь нажимает на одно из текстовых полей, открывается клавиатура.

При отклонении клавиатуры (вы можете увидеть уведомление об обратном вызове UIKeyboardWillHideNotification) вы можете установить для взаимодействия значение false.

person Kerberos    schedule 16.11.2017

функция закрытия KeyBoard при нажатии кнопки:

@IBAction func hideKeyboard() {
     textView.resignFirstResponder()
 }

функция для отображения клавиатуры:

 @IBAction func showKeyboard() {
     textView.becomeFirstResponder()
 }
person John D    schedule 16.11.2017
comment
У него две кнопки. То, что вы сказали, это то, что я имел в виду @rmaddy :) - person John D; 16.11.2017

Просто скопируйте и вставьте простой код для дополнительной кнопки, встроенной в клавиатуру

 func addKeyboardToolbar()  {
    let ViewForDoneButtonOnKeyboard = UIToolbar()
    ViewForDoneButtonOnKeyboard.sizeToFit()
    let button = UIButton.init(type: .custom)
    button.setImage(UIImage.init(named: "login-logo"), for: UIControlState.normal)
    button.addTarget(self, action:#selector(doneBtnfromKeyboardClicked), for:.touchUpInside)
    button.frame = CGRect.init(x: 0, y: 0, width:UIScreen.main.bounds.width, height: 30) //CGRectMake(0, 0, 30, 30)
    let barButton = UIBarButtonItem.init(customView: button)
    ViewForDoneButtonOnKeyboard.items = [barButton]
    postTextView.inputAccessoryView = ViewForDoneButtonOnKeyboard
}


@IBAction func doneBtnfromKeyboardClicked (sender: Any) {
        self.contentView.endEditing(true)
    }
person Mohammad Kamran Usmani    schedule 31.01.2019
comment
Спасибо за Ваш ответ. Через 2 года я бы уже нашел решение :) - person Danyl; 31.01.2019