Evento de cambio de texto en UITextField: capturando cada pulsación correctamente

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

Evento de cambio de texto en UITextField: cada carácter cuenta

\n\n

Imagina: estás escribiendo una aplicación para notas, búsqueda en catálogo o mensajería. El usuario apenas comienza a escribir en UITextField, y ya necesitas reaccionar: resaltar sugerencias, contar los caracteres restantes o enviar una solicitud al servidor. ¿Cómo capturar ese momento exacto en que el texto cambió? Una pregunta que atormenta a principiantes e incluso a desarrolladores iOS experimentados. En Stack Overflow, el tema UITextField text change event ha acumulado miles de visitas, y no es para menos.

\n\n

En el desarrollo iOS existen al menos tres enfoques funcionales. Y elegir el incorrecto puede costarte errores, fugas de memoria o 100 líneas de código innecesarias. Hoy desglosaremos todas las formas de rastrear el cambio de texto en UITextField: desde el clásico delegado hasta el moderno Combine. ¡Allá vamos!

\n\n

¿Por qué no basta con presionar un botón?

\n\n

Podría parecer sencillo: el usuario ingresó texto y presionó "Listo" o el botón "Buscar". Pero las interfaces modernas requieren reacción en tiempo real. Estos son escenarios típicos:

\n
    \n
  • Autocompletado (search as you type): las sugerencias aparecen con cada pulsación de tecla.
  • \n
  • Validación en vivo: verificación de correo electrónico o número de teléfono sin enviar el formulario.
  • \n
  • Contador de caracteres: por ejemplo, en un cliente de Twitter, mostrar cuántas letras quedan hasta el límite.
  • \n
  • Búsqueda dinámica: filtrado de una lista de contactos o productos.
  • \n
\n

En todos estos casos, necesitamos el evento UITextField text change event. Y ahora la pregunta: ¿cómo implementarlo correctamente en Swift?

\n\n

Forma 1: Delegado UITextFieldDelegate — el clásico del género

\n\n

El método más obvio y quizás el más popular. Asignas un delegado a tu campo de texto e implementas el método textField(_:shouldChangeCharactersIn:replacementString:). Pero hay un detalle: este método se llama antes de que el texto realmente cambie. Pregunta: "¿Se puede insertar este carácter?"

\n\n

Para obtener el texto actual, debes construirlo manualmente:

\n\n
class ViewController: UIViewController, UITextFieldDelegate {\n    \n    @IBOutlet weak var textField: UITextField!\n    \n    override func viewDidLoad() {\n        super.viewDidLoad()\n        textField.delegate = self\n    }\n    \n    func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {\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        \n        print("Nuevo texto: \\(updatedText)")\n        // Aquí puedes actualizar la UI o iniciar una búsqueda\n        return true\n    }\n}\n
\n\n

Ventajas:

\n
    \n
  • Control total sobre la entrada: puedes prohibir la inserción de ciertos caracteres.
  • \n
  • Funciona en todas las versiones de iOS.
  • \n
\n

Desventajas:

\n
    \n
  • Código engorroso para algo tan simple como "capturar un cambio".
  • \n
  • Hay que recordar NSRange y la conversión a Range<String.Index>.
  • \n
  • No se activa con cambios programáticos como textField.text = "nuevo texto".
  • \n
\n\n

Este enfoque es ideal si necesitas validar la entrada (por ejemplo, prohibir letras en un campo de número de teléfono). Pero para un simple seguimiento de cambios, existen opciones más elegantes.

\n\n

Forma 2: Target-Action (UIControl.Event.editingChanged) — simplicidad y fiabilidad

\n\n

La segunda forma es agregar un objetivo y una acción para el evento .editingChanged. Se activa después de cada cambio de texto, y el código es conciso:

\n

Blogs

Book Recommendations