Cómo detectar cambios de texto en UITextField: mejores prácticas 2025

Entrenador de Python en Línea para Principiantes

Aprende Python fácilmente sin sobrecargarte de teoría. Resuelve tareas prácticas con verificación automática, recibe pistas y escribe código directamente en el navegador, sin instalar nada.

Start Course

Introducción: ¿Por qué "capturar" el cambio de texto es fundamental?

\n\n

Imagine: está escribiendo una aplicación para buscar recetas. El usuario comienza a escribir "pasta" y su búsqueda debe activarse al instante, sin presionar un botón. O está haciendo un formulario de registro donde necesita resaltar el error "contraseña demasiado corta" tan pronto como el usuario haya escrito la tercera letra.

\n\n

En ambos casos, necesita saber el momento exacto en que cambió el texto en UITextField. Esta pregunta en Stack Overflow ha acumulado miles de visitas, y con razón. Todo desarrollador de iOS se encuentra con esto tarde o temprano.

\n\n

En 2025, tenemos al menos 4 formas de resolver este problema. Algunas son veteranos, probados por el tiempo. Otras son enfoques nuevos que Apple promueve activamente. En este artículo, analizaremos todas las opciones, desde lo clásico hasta lo moderno, y le mostraré qué método elegir para cada tarea específica.

\n\n

¡Allá vamos! 🚀

\n\n

Método 1. Target-Action: Antiguo pero funcional

\n\n

El método más simple y comprensible, que funciona desde iOS 2.0. Sí, tiene más de 15 años, pero sigue siendo relevante.

\n\n

La idea es que UITextField hereda de UIControl y, por lo tanto, puede generar eventos. Nos interesa el evento .editingChanged: se activa con cada cambio de texto.

\n\n

Ejemplo de código (UIKit + Storyboard o código)

\n\n
import UIKit\n\nclass ViewController: UIViewController {\n\n    @IBOutlet weak var searchTextField: UITextField!\n\n    override func viewDidLoad() {\n        super.viewDidLoad()\n        // Agregamos un objetivo para el evento de cambio de texto\n        searchTextField.addTarget(self,\n                                  action: #selector(textFieldDidChange(_:)),\n                                  for: .editingChanged)\n    }\n\n    @objc func textFieldDidChange(_ textField: UITextField) {\n        guard let text = textField.text else { return }\n        print("El texto cambió: \\(text)")\n        // Aquí se puede hacer búsqueda, validación, etc.\n    }\n}
\n\n

Ventajas: mínimo código, no requiere suscripción a protocolos, funciona rápido.

\n

Desventajas: necesita usar @objc — es legacy de Swift. No tiene control fino (por ejemplo, no se puede distinguir entre inserción y eliminación de texto).

\n\n

Método 2. Delegado UITextFieldDelegate: Control sobre cada carácter

\n\n

Si no solo necesita saber que el texto cambió, sino influir en el cambio (bloquear la entrada, formatear un número de teléfono), entonces el delegado es su opción.

\n\n

Aquí el método clave es textField(_:shouldChangeCharactersIn:replacementString:). Se llama antes de que el texto realmente cambie.

\n\n

Ejemplo: formateo de número de teléfono

\n\n
import UIKit\n\nclass ViewController: UIViewController, UITextFieldDelegate {\n\n    @IBOutlet weak var phoneTextField: UITextField!\n\n    override func viewDidLoad() {\n        super.viewDidLoad()\n        phoneTextField.delegate = self\n    }\n\n    func textField(_ textField: UITextField,\n                   shouldChangeCharactersIn range: NSRange,\n                   replacementString string: String) -> Bool {\n\n        // Permitimos solo dígitos\n        let allowedCharacters = CharacterSet.decimalDigits\n        let characterSet = CharacterSet(charactersIn: string)\n        guard allowedCharacters.isSuperset(of: characterSet) else {\n            return false\n        }\n\n        // Limitamos la longitud a 10 caracteres\n        let currentText = textField.text ?? ""\n        guard let stringRange = Range(range, in: currentText) else { return false }\n        let updatedText = currentText.replacingCharacters(in: stringRange, with: string)\n        return updatedText.count <= 10\n    }\n\n    // Adicionalmente: capturamos el momento en que el texto ya cambió\n    func textFieldDidChangeSelection(_ textField: UITextField) {\n        print("Texto actualizado: \\(textFi                

Blogs

Book Recommendations