Swift: Есть ли способ, когда кто-то нажимает клавишу на клавиатуре?

Есть ли метод, который я могу использовать, когда любая кнопка на клавиатуре была нажата на клавиатуре, которая вводит ввод в текстовое поле в Swift? Как мне что-то сделать (например, отобразить изображение в правом представлении UITextField), когда нажимается любая клавиша, которая вводит ввод в UITextField (за исключением, например, таких клавиш, как блокировка заглавных букв и клавиша emoji/переключение языка)?


person Joe N    schedule 22.02.2019    source источник
comment
Вы проверили UITextFieldDelegate?   -  person Alexander    schedule 22.02.2019


Ответы (6)


Вы можете сделать это очень легко

Вот код:

extension ViewController : UITextFieldDelegate {
    func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {

        let userImageView = UIImageView(image: UIImage(named: "user"))
        userImageView.frame = CGRect(x: 0, y: 0, width: 30, height: 30)
        self.txtField.rightViewMode = .always

        if let textFieldValue = textField.text,
            let textFieldRange = Range(range, in: textFieldValue) {
            let newText = textFieldValue.replacingCharacters(in: textFieldRange, with: string)
            if newText == "" {
                textField.rightView = nil
            } else {
                textField.rightView = userImageView
            }
        }
        return true

    }
}

Выход:

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

Если вы столкнетесь с какими-либо трудностями в этом, пожалуйста, дайте мне знать.

person iOS Team    schedule 22.02.2019
comment
@JoeN тот же ответ был дан за 30 минут до этого ответа. Я не понял, почему вы не приняли мой ответ??? - person Jarvis The Avenger; 25.02.2019

Клавиатура обычно появляется в случае UITextfield и UITextView, которые пытаются использовать нижеуказанные делегаты.

Итак, в случае UITextField

- (BOOL)textField:(UITextField *)textField
          shouldChangeCharactersInRange:(NSRange)range
          replacementString:(NSString *)string {

    // Do something here...
}

Когда вы используете клавиатуру В случае UITextView:

- (BOOL)textView:(UITextView *)textView
      shouldChangeTextInRange:(NSRange)range 
      replacementText:(NSString *)text {

    // Do something here...
}

Помните об этом, каждый раз, когда пользователь вводит какой-либо символ или нажимает какую-либо клавишу на клавиатуре, этот метод будет вызываться, и вы будете знать текст, который он выбрал с клавиатуры.

person Hairsh Kuramsetty    schedule 22.02.2019
comment
Вопрос помечен Swift, а не Objective-C. - person rmaddy; 22.02.2019
comment
Есть ли способ, которым вы можете поместить это в Swift? - person Joe N; 22.02.2019
comment
@JoeN Здесь нет ничего, что вы не могли бы увидеть, просто взглянув на справочную документацию для UITextFieldDelegate и UITextViewDelegate. - person rmaddy; 22.02.2019

Вы можете использовать этот делегат для управления им:

func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {

   // String 键盘上新输入的字符,“”代表删除

    //返回true会添加进去,返回false会忽略掉
    return true
}
person Dandelion    schedule 22.02.2019
comment
Также обратите внимание, что это может быть вызвано в случаях, когда пользователь не нажал клавишу, например, когда пользователь выполняет вырезание или вставку. - person rmaddy; 22.02.2019
comment
Да, это просто ответ на код, который будет вставлен в ваш контроль - person Dandelion; 22.02.2019
comment
Поскольку это условие, я думаю, что только создание пользовательского inputView (представление с клавиатуры) может соответствовать требованиям. - person Dandelion; 22.02.2019
comment
Эта половина работает. RightView теперь не исчезнет, ​​даже после того, как я верну все, что набираю. - person Joe N; 22.02.2019

да, вы можете сделать, добавив addTarget в viewDidLoad

override func viewDidLoad() {
    // do your works
    self.yourtextfield.addTarget(self, action: #selector(textFieldChanged), for: .editingChanged)
}

@objc func textFieldChanged() {
     // do your work here 
}

Что такое addTarget?

Связывает целевой объект и метод действия с элементом управления.

Вы записываете addTarget с тем действием, которое вы хотите (т. е. редактирование изменения, текстовое поле действительно начало редактирование или завершение редактирования), и связывается метод селектора, когда вызывается элемент управления (здесь редактирование изменения), этот метод селектора будет вызываться, и вы можете обрабатывать свои код, что вы хотите относительно контроля

person Ankur Lahiry    schedule 22.02.2019

Вы можете сделать это двумя способами:

  1. UITextFieldDelegate

    func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
       // Observer changes in text....
       return true
    }
    
  2. Целевой механизм действия:

В вашем viewDidLoad добавьте следующий код:

self.textfield.addTarget(self, action: #selector(textFieldTextChanged), for: .editingChanged)

И метод реализации:

@objc func textFieldTextChanged() {
     print(self.textfield.text!)
}

Обновлено:

class ViewController: UIViewController {

    @IBOutlet weak var textField: UITextField!
     let rightView = UIView(frame: CGRect(x: -10, y: 0, width: 20, height: 20))

    override func viewDidLoad() {
        super.viewDidLoad()
        rightView.backgroundColor = .red
        textField.rightView = rightView
        textField.rightViewMode = .always
    }


}

extension ViewController : UITextFieldDelegate {
    func textField(_ textField: UITextField,
                   shouldChangeCharactersIn range: NSRange,
                   replacementString string: String) -> Bool {

        if let text = textField.text, let textRange = Range(range, in: text) {
            let updatedText = text.replacingCharacters(in: textRange, with: string)

            if updatedText == "" {
                textField.rightView = nil
            } else {
                textField.rightView = rightView
            }

        }
        return true
    }

}
person Jarvis The Avenger    schedule 22.02.2019
comment
В порядке. Я использовал первый. Это почти работает, за исключением случаев, когда я нажимаю клавишу Backspace. Кнопка очистки все еще там. Как мне заставить его исчезнуть, когда я все удалил? - person Joe N; 22.02.2019
comment
какая кнопка сброса?? можете ли вы добавить это в свой вопрос ?? - person Jarvis The Avenger; 22.02.2019
comment
О, извините, я забыл сказать, изображение, отображаемое в правом представлении, выглядит как кнопка очистки. - person Joe N; 22.02.2019
comment
Ваш 1. работает, но когда я нажимаю Backspace и очищаю все в текстовом поле, я также хочу избавиться от rightView. - person Joe N; 22.02.2019
comment
@JoeN, тогда вам просто нужно добавить этот метод регистрации, когда текст вашего текстового поля пуст. Я думаю, вам просто нужно соблюдать последовательность, и я уверен, что у вас все получится. - person Jarvis The Avenger; 22.02.2019
comment
@JoeN проверить этот вопрос: stackoverflow .com/questions/51894973/ - person Jarvis The Avenger; 22.02.2019
comment
@JoeN, если вы сможете получить событие возврата, будет легко просто проверить, когда текст вашего текстового поля получает, и, соответственно, просто удалить правильный вид. - person Jarvis The Avenger; 22.02.2019
comment
нет решения?? - person Joe N; 22.02.2019
comment
@JoeN проверить решение - person Jarvis The Avenger; 22.02.2019

Мое решение для пользовательской кнопки очистки:

Просто добавьте это вне вашего класса

extension ViewController: UITextFieldDelegate {

func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {

    let clearButton = UIImageView(frame:
        CGRect(x: 7, y: 7, width: 16, height: 16))
    clearButton.image = #imageLiteral(resourceName: "Clear")

    let iconContainerView: UIView = UIView(frame:
        CGRect(x: 0, y: 0, width: 37, height: 30))
    iconContainerView.addSubview(clearButton)
    iconContainerView.tintColor = #colorLiteral(red: 0.5568627451, green: 0.5568627451, blue: 0.5764705882, alpha: 1)

    textField.rightView = iconContainerView
    textField.rightViewMode = .whileEditing

    if let textFieldValue = textField.text, let textFieldRange = Range(range, in: textFieldValue) {
        let newText = textFieldValue.replacingCharacters(in: textFieldRange, with: string)
        if newText == "" {
            textField.rightView = nil
        } else {
            textField.rightView = iconContainerView
        }
    }

    return true

    }
}
person Joe N    schedule 23.02.2019