Добавление события редактирования в UITextField требуется в большинстве случаев. Для таких представлений, как UITextField, мы можем связать IBAction с типом события, когда редактирование закончилось или значение изменилось, и получить обратный вызов для завершения редактирования или изменения значения.

This post was originally posted at https://agrawalsuneet.github.io/blogs/uitextfield-text-listener-swift/ and reposted on Medium on 12th April 2022.

Если вы не используете xib или раскадровку, а создаете макет программно или с помощью swiftUI, вы можете редактировать событие, используя целевое действие, которое принимает три параметра:

  1. цель любого типа, допускающего значение NULL
  2. действие типа Selector
  3. controlEvents из UIControl.Event

Код для того же будет выглядеть ниже.

//swift code in viewcontroller
self.inputTextField.addTarget(self, action: #selector(textFieldDidChange(_:)), for: .editingChanged)
 @objc private func textFieldDidChange(_ textField: UITextField) {
    //do something here
}

Поскольку селектор принимает только функции @objc, которые могут быть определены только как член класса или расширение класса, нам нужно определить его только на уровне класса.

@objc can only be used with members of classes, @objc protocols, and concrete extensions of classes

Этот способ немного неэффективен, так как нам нужно добавить одну функцию для каждого UITextField, где нам нужно событие редактирования.

Есть лучший способ добавить эту функциональность к каждому UITextField, не запутывая наш класс.
Мы можем добавить это в само расширение UITextField, что будет очень чистым подходом и сделает нашу жизнь очень легкой.

Во-первых, добавьте функцию в качестве расширения к классу UITextField, который принимает функцию в качестве параметра с 0 параметрами и типом возвращаемого значения Void.
Поскольку эта функция будет нашей функцией обратного вызова, добавьте @escaping к функции, переданной в качестве параметра.

//MARK: - UITextField Extension
extension UITextField {
    func setOnTextChangeListener(onTextChanged :@escaping () -> Void){
        
    }
}

Теперь добавьте действие к объекту UITextField в той же функции, которая принимает два параметра.

  1. действие типа UIAction
  2. controlEvents из UIControl.Event

Существует несколько конструкторов для UIAction, но мы возьмем самый простой, где он принимает один параметр, то есть обработчик типа UIActionHandler. Остальные параметры либо имеют значение по умолчанию, либо относятся к типам, допускающим значение null.
И мы можем вызвать нашу функцию обратного вызова в обратном вызове обработчика.

//MARK: - UITextField Extension
@available(iOS 14.0, *)
extension UITextField {
    
    func setOnTextChangeListener(onTextChanged :@escaping () -> Void){   
        self.addAction(UIAction(){ action in
            
            onTextChanged()
        }, for: .editingChanged) 
    }
}

Пожалуйста, продолжайте читать на https://agrawalsuneet.github.io/blogs/uitextfield-text-listener-swift/

Это все на данный момент. Вы можете прочитать другие мои интересные блоги здесь или насладиться моими играми или приложениями, перечисленными здесь. Не стесняйтесь использовать мои компоненты Android с открытым исходным кодом в своем приложении, указанном здесь. Или напишите электронное письмо, если вы не нашли то, что ищете, и вам нужна помощь.