UITextField Text Listener : Swift

Suneet Agrawal
2 min readApr 12, 2022

--

Adding an editing event to a UITextField is something that is required most of the time. For views like UITextField, we can connect an IBAction with the event type as editing did end or value changed and get a callback for editing finished or value changed.

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

If you are not using xib or storyboard but creating the layout programmatically or by using swiftUI, you can the editing event using a target action that takes three parameters,

  1. target of Any type which is nullable
  2. action of Selector type
  3. controlEvents of UIControl.Event

The code for the same will look like below.

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

Since the Selector takes only @objc functions which can only be defined as a member of the class or an extension of the class, we need to define it at a class level only.

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

This way is a bit inefficient as we need to add one function for each UITextField where we need editing event.

There is a better way where we can add this functionality to each UITextField without making our class messy.
We can add this to the UITextField extension itself which will be a very clean approach and will make our life super easy.

First, add a function as an extension to UITextField class which takes a function as a parameter with 0 params and Void return type.
Since this function will be our callback function, add @escaping to the function passed as the parameter.

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

}
}

Now add an action to the UITextField object in the same function which takes two parameters.

  1. action of UIAction type
  2. controlEvents of UIControl.Event

There are multiple constructors for UIAction but will take the most simple one where it takes one parameter ie handler of UIActionHandler type. Rest all params either have a default value or are of nullable types.
And, we can call our callback function in the handler callback.

//MARK: - UITextField Extension
@available(iOS 14.0, *)
extension UITextField {

func setOnTextChangeListener(onTextChanged :@escaping () -> Void){
self.addAction(UIAction(){ action in

onTextChanged()
}, for: .editingChanged)
}
}

Please continue reading at https://agrawalsuneet.github.io/blogs/uitextfield-text-listener-swift/

That’s all for now. You can read my other interesting blogs here or you can enjoy my games or apps listed here. Feel free to use my open-source Android components in your app listed here. Or drop an email, if you didn’t find what you are looking for and need some help.

--

--