First Responder es el objeto UIResponder en iOS que recibe primero los eventos de toque, pulsaciones de teclas, gestos de agitación y comandos de menú. En cualquier momento, solo un objeto en la aplicación puede ser first responder. La asignación ocurre automáticamente (cuando un UITextField obtiene el foco) o mediante programación a través del método becomeFirstResponder. Según la Documentación para Desarrolladores de Apple (2026), un objeto puede convertirse en first responder solo si su método canBecomeFirstResponder devuelve true, lo que hace que este mecanismo sea explícito y controlable.
Puntos clave
First Responder es el objeto UIResponder que actualmente recibe eventos de entrada en una aplicación iOS. El sistema dirige todos los eventos de toque, pulsaciones de teclas, eventos de movimiento (agitación del dispositivo) y mensajes de acción (por ejemplo, invocar un menú contextual) a este objeto.
El concepto de first responder es el primer eslabón en la Cadena de Respondedores (Responder Chain). Si el first responder no maneja un evento recibido, se pasa automáticamente al siguiente objeto en la cadena. Esto garantiza que un evento no se pierda, sino que se ofrezca secuencialmente a todos los manejadores potenciales en la jerarquía.
Según Apple, el estado de first responder está estrechamente vinculado a UIResponder y sus métodos canBecomeFirstResponder y becomeFirstResponder. Por defecto, UIView devuelve true solo para ciertas subclases: UITextField, UITextView, UISearchBar. Otras vistas, incluido un UIView simple, devuelven false, lo que evita la asignación accidental.
La asignación de first responder puede ocurrir de dos maneras: automáticamente, cuando el usuario toca un UITextField (el sistema llama a becomeFirstResponder internamente), o mediante programación, cuando el desarrollador llama explícitamente al método becomeFirstResponder en cualquier objeto UIResponder.
Antes de la asignación, iOS verifica canBecomeFirstResponder. Si el método devuelve false, la llamada a becomeFirstResponder se ignora y el objeto no se convierte en first responder. Este es un mecanismo de protección que evita asignar objetos que no están listos para manejar eventos, como elementos de interfaz ocultos o deshabilitados.
class CustomTextField: UITextField {
override var canBecomeFirstResponder: Bool {
return super.canBecomeFirstResponder
}
}
// Asignación programática
textField.becomeFirstResponder()
// Verificar si es first responder
if textField.isFirstResponder {
print("TextField ahora es first responder")
}
Cuando se asigna un nuevo first responder, iOS llama automáticamente a resignFirstResponder en el anterior. Esto garantiza que siempre haya solo un objeto con estado de first responder en el sistema. Si el nuevo objeto no puede convertirse en first responder (canBecomeFirstResponder = false), el anterior conserva su estado.
El teclado de iOS aparece en pantalla precisamente gracias al mecanismo de first responder. Cuando un UITextField o UITextView se convierte en first responder, el sistema muestra automáticamente el teclado asociado con el keyboardType actual de ese campo. Cuando el first responder renuncia, el teclado se oculta.
Este comportamiento es un mecanismo UX clave en iOS: el usuario toca un campo de entrada — aparece el teclado; presiona Retorno o toca otro campo — el teclado cambia o se oculta. El desarrollador puede controlar esto a través de los métodos de UIResponder, así como mediante inputView e inputAccessoryView para reemplazar el teclado estándar por uno personalizado.
Input Accessory View es un panel adicional sobre el teclado que también está vinculado al first responder. Por ejemplo, un panel con botones Siguiente, Anterior, Hecho para navegar entre campos de entrada. Aparece y se oculta junto con el teclado, sincronizándose con el estado de first responder.
| Evento | Estado de first responder | Teclado |
|---|---|---|
| Tocar UITextField | Se convierte en first responder | Aparece |
| Presionar Retorno | Permanece o renuncia | Permanece o se oculta |
| Tocar otro campo | Pasa al nuevo campo | Cambia |
| Llamar a resignFirstResponder | Se elimina | Se oculta |
| App en segundo plano | Renuncia automáticamente | Se oculta |
ResignFirstResponder es un método de UIResponder que elimina el estado de first responder de un objeto. Después de la llamada, el objeto deja de recibir eventos de entrada y el teclado (si estaba activo) se oculta. El método devuelve un Bool — true si la renuncia fue exitosa.
Los desarrolladores suelen llamar a resignFirstResponder en respuesta a presionar el botón Hecho, tocar un área vacía de la pantalla (view.endEditing) o al salir de la pantalla. view.endEditing(true) es una forma conveniente de renunciar para todos los campos de texto hijos a la vez: recorre toda la jerarquía de vistas y llama a resignFirstResponder en el first responder actual.
// Renunciar al tocar el botón Hecho
@objc func doneButtonTapped() {
textField.resignFirstResponder()
}
// Renunciar al tocar área vacía
override func touchesBegan(
_ touches: Set<UITouch>,
with event: UIEvent?
) {
view.endEditing(true)
}
// Renunciar para todos los campos del formulario
func validateAndSubmit() {
view.endEditing(true)
// Lógica de envío del formulario
}
Existen situaciones en las que resignFirstResponder puede devolver false. Esto ocurre si el objeto ha sobrescrito el método y ha prohibido explícitamente la eliminación del estado. Por ejemplo, un campo de texto en proceso de validación puede bloquear temporalmente la renuncia para evitar la pérdida de datos. En tales casos, debes esperar a que la validación termine y solo entonces renunciar forzosamente.
UIResponder proporciona la propiedad isFirstResponder (solo lectura), que devuelve true si el objeto dado es actualmente el first responder. Esto es útil para lógica condicional, por ejemplo, para evitar realizar una acción si un campo de texto está enfocado y el usuario está ingresando datos.
iOS no proporciona una API integrada para obtener el first responder actual a nivel de toda la aplicación. Los desarrolladores logran esto recorriendo la jerarquía de vistas mediante el método de UIResponder. Apple recomienda una referencia débil al first responder, que se puede actualizar mediante KVO o delegados.
// Extensión para encontrar first responder
extension UIView {
var firstResponder: UIResponder? {
guard isFirstResponder else {
return subviews.compactMap { $0.firstResponder }.first
}
return self
}
}
// Uso
if let current = view.firstResponder {
print("Current first responder: \(current)")
}
Para rastrear cambios en el first responder, puedes suscribirte a UIResponder.keyboardWillShowNotification y UIResponder.keyboardWillHideNotification — indican indirectamente que algún objeto de texto se ha convertido o ha dejado de ser el first responder. Sin embargo, no existe una suscripción directa para cambios en isFirstResponder; se utilizan KVO o delegados personalizados.
Las vistas personalizadas pueden convertirse en first responder si sobrescriben canBecomeFirstResponder y devuelven true. Esto es necesario para componentes que deben recibir eventos del teclado o botones físicos, como controladores de juego personalizados o editores de código basados en UITextView.
Al crear un first responder personalizado, es importante tener en cuenta la accesibilidad: VoiceOver y Switch Control dependen de la asignación correcta del first responder para la navegación. Si una vista personalizada se convierte en first responder, debe implementar correctamente el protocolo UIAccessibility e informar su estado a las tecnologías de asistencia.
Para entrada personalizada (por ejemplo, un escáner de códigos de barras o un teclado numérico), sobrescribe la propiedad inputView — devuelve una UIView personalizada que se mostrará en lugar del teclado estándar cuando esta vista sea first responder. Del mismo modo, inputAccessoryView agrega un panel sobre el teclado.
Preguntas frecuentes
First Responder es el objeto UIResponder que actualmente recibe eventos de entrada (toque, teclas, acelerómetro). Se asigna mediante becomeFirstResponder y debe devolver true de canBecomeFirstResponder. Solo un objeto puede ser first responder en una aplicación.
Llama a textField.becomeFirstResponder() mediante programación, por ejemplo, en viewDidAppear. Asegúrate de que textField no esté oculto, userInteractionEnabled = true e isEnabled = true. Si el campo está dentro de un UITableView o UICollectionView, asegúrate de que la celda sea visible en pantalla.
Agrega un UITapGestureRecognizer a la vista principal y llama a view.endEditing(true) en su manejador. Esto encontrará automáticamente el first responder actual y llamará a resignFirstResponder. Alternativamente, sobrescribe touchesBegan en UIViewController con una llamada a endEditing.
becomeFirstResponder devuelve false si canBecomeFirstResponder devuelve false, la vista está oculta, no está en la jerarquía de la ventana o userInteractionEnabled = false. También verifica que la vista esté agregada a la ventana — una vista que no esté en pantalla no responderá a becomeFirstResponder.
iOS no proporciona una API global para esto. Usa un recorrido recursivo de la jerarquía de vistas mediante una extensión de UIView que verifique isFirstResponder en cada subvista. Una alternativa es almacenar una referencia débil al último first responder en AppDelegate y actualizarla mediante delegados de UITextField.
Resumen
Desarrollaremos una aplicación móvil llave en mano
IT Sectr crea aplicaciones para iOS y Android para startups y empresas desde 2017. Le asesoraremos y le propondremos la mejor solución.
Lea también