First Responder est l’objet UIResponder dans iOS qui reçoit en premier les événements tactiles, les pressions de touches, les gestes d’agitation et les commandes de menu. À tout moment, un seul objet dans l’application peut être first responder. L’assignation se produit automatiquement (lorsqu’un UITextField obtient le focus) ou par programme via la méthode becomeFirstResponder. Selon la Documentation Développeur Apple (2026), un objet ne peut devenir first responder que si sa méthode canBecomeFirstResponder retourne true, rendant ce mécanisme explicite et contrôlable.
Points clés
First Responder est l’objet UIResponder qui reçoit actuellement les événements d’entrée dans une application iOS. Le système dirige tous les événements tactiles, pressions de touches, événements de mouvement (secouement de l’appareil) et messages d’action (par exemple, l’invocation d’un menu contextuel) vers cet objet.
Le concept de first responder est le premier maillon de la chaîne de répondeurs (Responder Chain). Si le first responder ne traite pas un événement reçu, celui-ci est automatiquement transmis à l’objet suivant dans la chaîne. Cela garantit qu’un événement n’est pas perdu mais est proposé séquentiellement à tous les gestionnaires potentiels dans la hiérarchie.
Selon Apple, le statut de first responder est étroitement lié à UIResponder et à ses méthodes canBecomeFirstResponder et becomeFirstResponder. Par défaut, UIView retourne true uniquement pour certaines sous-classes — UITextField, UITextView, UISearchBar. Les autres vues, y compris une UIView simple, retournent false, ce qui évite une assignation accidentelle.
L’assignation du first responder peut se produire de deux manières : automatiquement, lorsque l’utilisateur touche un UITextField (le système appelle becomeFirstResponder en interne), ou par programme, lorsque le développeur appelle explicitement la méthode becomeFirstResponder sur n’importe quel objet UIResponder.
Avant l’assignation, iOS vérifie canBecomeFirstResponder. Si la méthode retourne false, l’appel à becomeFirstResponder est ignoré et l’objet ne devient pas first responder. C’est un mécanisme de protection qui empêche l’assignation d’objets qui ne sont pas prêts à traiter des événements — par exemple, des éléments d’interface masqués ou désactivés.
class CustomTextField: UITextField {
override var canBecomeFirstResponder: Bool {
return super.canBecomeFirstResponder
}
}
// Assignation programmatique
textField.becomeFirstResponder()
// Vérifier si first responder
if textField.isFirstResponder {
print("TextField est maintenant first responder")
}
Lorsqu’un nouveau first responder est assigné, iOS appelle automatiquement resignFirstResponder sur le précédent. Cela garantit qu’il y a toujours un seul objet avec le statut de first responder dans le système. Si le nouvel objet ne peut pas devenir first responder (canBecomeFirstResponder = false), l’ancien conserve son statut.
Le clavier iOS apparaît à l’écran précisément grâce au mécanisme de first responder. Lorsqu’un UITextField ou UITextView devient first responder, le système affiche automatiquement le clavier associé au keyboardType actuel de ce champ. Lorsque le first responder resign, le clavier se masque.
Ce comportement est un mécanisme UX clé dans iOS : l’utilisateur touche un champ de saisie — le clavier apparaît ; appuie sur Retour ou touche un autre champ — le clavier bascule ou se masque. Le développeur peut contrôler cela via les méthodes UIResponder, ainsi que via inputView et inputAccessoryView pour remplacer le clavier standard par un clavier personnalisé.
Input Accessory View est un panneau supplémentaire au-dessus du clavier qui est également lié au first responder. Par exemple, un panneau avec les boutons Suivant, Précédent, Terminé pour naviguer entre les champs de saisie. Il apparaît et se masque avec le clavier, en se synchronisant avec le statut de first responder.
| Événement | Statut first responder | Clavier |
|---|---|---|
| Toucher UITextField | Devient first responder | Apparaît |
| Appuyer sur Retour | Reste ou resign | Reste ou se masque |
| Toucher un autre champ | Passe au nouveau champ | Bascule |
| Appeler resignFirstResponder | Supprimé | Se masque |
| Application en arrière-plan | Resign automatiquement | Se masque |
ResignFirstResponder est une méthode UIResponder qui supprime le statut de first responder d’un objet. Après l’appel, l’objet cesse de recevoir des événements d’entrée et le clavier (s’il était actif) se masque. La méthode retourne un Booléen — true si le resign a réussi.
Les développeurs appellent souvent resignFirstResponder en réponse à l’appui sur le bouton Terminé, au toucher d’une zone vide de l’écran (view.endEditing) ou en quittant l’écran. view.endEditing(true) est un moyen pratique de resign pour tous les champs de texte enfants à la fois : il parcourt toute la hiérarchie de vues et appelle resignFirstResponder sur le first responder actuel.
// Resign sur appui du bouton Terminé
@objc func doneButtonTapped() {
textField.resignFirstResponder()
}
// Resign sur toucher zone vide
override func touchesBegan(
_ touches: Set<UITouch>,
with event: UIEvent?
) {
view.endEditing(true)
}
// Resign pour tous les champs du formulaire
func validateAndSubmit() {
view.endEditing(true)
// Logique de soumission du formulaire
}
Il existe des situations où resignFirstResponder peut retourner false. Cela se produit si l’objet a surchargé la méthode et a explicitement interdit la suppression du statut. Par exemple, un champ de texte en cours de validation peut temporairement bloquer le resign pour éviter une perte de données. Dans ce cas, attendez la fin de la validation avant de resigner de force.
UIResponder fournit la propriété isFirstResponder (lecture seule), qui retourne true si l’objet donné est actuellement le first responder. C’est utile pour la logique conditionnelle — par exemple, pour éviter d’exécuter une action si un champ de texte est focus et que l’utilisateur saisit des données.
iOS ne fournit pas d’API intégrée pour obtenir le first responder actuel à l’échelle de l’application. Les développeurs y parviennent en parcourant la hiérarchie des vues avec la méthode UIResponder. Apple recommande une référence faible (weak reference) au first responder, qui peut être mise à jour via KVO ou des délégations.
// Extension pour trouver first responder
extension UIView {
var firstResponder: UIResponder? {
guard isFirstResponder else {
return subviews.compactMap { $0.firstResponder }.first
}
return self
}
}
// Utilisation
if let current = view.firstResponder {
print("Current first responder: \(current)")
}
Pour le suivi des changements du first responder, vous pouvez vous abonner à UIResponder.keyboardWillShowNotification et UIResponder.keyboardWillHideNotification — ils indiquent indirectement qu’un objet texte est devenu ou a cessé d’être le first responder. Cependant, il n’existe pas d’abonnement direct aux changements d’isFirstResponder ; on utilise KVO ou des délégations personnalisées.
Les vues personnalisées peuvent devenir first responder si elles surchargent canBecomeFirstResponder et retournent true. Cela est nécessaire pour les composants qui doivent recevoir des événements de clavier ou de boutons physiques — comme des manettes de jeu personnalisées ou des éditeurs de code basés sur UITextView.
Lors de la création d’un first responder personnalisé, il est important de prendre en compte l’accessibilité : VoiceOver et Switch Control dépendent de l’assignation correcte du first responder pour la navigation. Si une vue personnalisée devient first responder, elle doit implémenter correctement le protocole UIAccessibility et signaler son statut aux technologies d’assistance.
Pour une saisie personnalisée (par exemple, un lecteur de code-barres ou un clavier numérique), surchargez la propriété inputView — retournez une UIView personnalisée qui sera affichée au lieu du clavier standard lorsque cette vue est first responder. De même, inputAccessoryView ajoute un panneau au-dessus du clavier.
Foire aux questions
First Responder est l’objet UIResponder qui reçoit actuellement les événements d’entrée (tactiles, touches, accéléromètre). Il est assigné via becomeFirstResponder et doit retourner true de canBecomeFirstResponder. Un seul objet peut être first responder dans une application.
Appelez textField.becomeFirstResponder() par programme, par exemple dans viewDidAppear. Assurez-vous que textField n’est pas masqué, que userInteractionEnabled = true et isEnabled = true. Si le champ se trouve dans un UITableView ou UICollectionView, vérifiez que la cellule est visible à l’écran.
Ajoutez un UITapGestureRecognizer à la vue principale et appelez view.endEditing(true) dans son gestionnaire. Cela trouvera automatiquement le first responder actuel et appellera resignFirstResponder. Sinon, surchargez touchesBegan dans UIViewController avec un appel à endEditing.
becomeFirstResponder retourne false si canBecomeFirstResponder retourne false, si la vue est masquée, si elle n’est pas dans la hiérarchie de la fenêtre, ou si userInteractionEnabled = false. Vérifiez également que la vue est ajoutée à la fenêtre — une vue qui n’est pas à l’écran ne répondra pas à becomeFirstResponder.
iOS ne fournit pas d’API globale pour cela. Utilisez un parcours récursif de la hiérarchie des vues via une extension UIView qui vérifie isFirstResponder sur chaque sous-vue. Une alternative consiste à stocker une référence faible au dernier first responder dans AppDelegate et à la mettre à jour via les délégations UITextField.
Résumé
Nous développerons une application mobile clé en main
IT Sectr crée des applications iOS et Android pour les startups et les entreprises depuis 2017. Nous vous conseillerons et vous proposerons la meilleure solution.
Lisez aussi