First Responder è l'oggetto UIResponder in iOS che riceve per primo gli eventi tattili, le pressioni dei tasti, i gesti di scossa e i comandi del menu. In ogni momento, solo un oggetto nell'applicazione può essere first responder. L'assegnazione avviene automaticamente (quando un UITextField ottiene il focus) o tramite programmazione con il metodo becomeFirstResponder. Secondo la Documentazione per Sviluppatori Apple (2026), un oggetto può diventare first responder solo se il suo metodo canBecomeFirstResponder restituisce true, rendendo questo meccanismo esplicito e controllabile.
Punti chiave
First Responder è l'oggetto UIResponder che attualmente riceve gli eventi di input in un'applicazione iOS. Il sistema indirizza tutti gli eventi tattili, le pressioni dei tasti, gli eventi di movimento (scuotimento del dispositivo) e i messaggi di azione (ad esempio, l'invocazione di un menu contestuale) a questo oggetto.
Il concetto di first responder è il primo anello della Catena dei Responder (Responder Chain). Se il first responder non gestisce un evento ricevuto, questo viene automaticamente passato all'oggetto successivo nella catena. Ciò garantisce che un evento non vada perso ma venga offerto sequenzialmente a tutti i potenziali gestori nella gerarchia.
Secondo Apple, lo stato di first responder è strettamente legato a UIResponder e ai suoi metodi canBecomeFirstResponder e becomeFirstResponder. Per impostazione predefinita, UIView restituisce true solo per determinate sottoclassi — UITextField, UITextView, UISearchBar. Altre viste, inclusa una semplice UIView, restituiscono false, impedendo un'assegnazione accidentale.
L'assegnazione del first responder può avvenire in due modi: automaticamente, quando l'utente tocca un UITextField (il sistema chiama internamente becomeFirstResponder), o tramite programmazione, quando lo sviluppatore chiama esplicitamente il metodo becomeFirstResponder su qualsiasi oggetto UIResponder.
Prima dell'assegnazione, iOS verifica canBecomeFirstResponder. Se il metodo restituisce false, la chiamata a becomeFirstResponder viene ignorata e l'oggetto non diventa first responder. Questo è un meccanismo di protezione che impedisce l'assegnazione di oggetti non pronti a gestire eventi — ad esempio, elementi dell'interfaccia nascosti o disabilitati.
class CustomTextField: UITextField {
override var canBecomeFirstResponder: Bool {
return super.canBecomeFirstResponder
}
}
// Assegnazione programmatica
textField.becomeFirstResponder()
// Verificare se è first responder
if textField.isFirstResponder {
print("TextField ora è first responder")
}
Quando viene assegnato un nuovo first responder, iOS chiama automaticamente resignFirstResponder sul precedente. Ciò garantisce che ci sia sempre un solo oggetto con stato di first responder nel sistema. Se il nuovo oggetto non può diventare first responder (canBecomeFirstResponder = false), il vecchio mantiene il suo stato.
La tastiera iOS appare sullo schermo proprio grazie al meccanismo di first responder. Quando un UITextField o UITextView diventa first responder, il sistema mostra automaticamente la tastiera associata al keyboardType corrente di quel campo. Quando il first responder resign, la tastiera si nasconde.
Questo comportamento è un meccanismo UX chiave in iOS: l'utente tocca un campo di input — la tastiera appare; preme Invio o tocca un altro campo — la tastiera cambia o si nasconde. Lo sviluppatore può controllarlo tramite i metodi UIResponder, nonché tramite inputView e inputAccessoryView per sostituire la tastiera standard con una personalizzata.
Input Accessory View è un pannello aggiuntivo sopra la tastiera che è anch'esso legato al first responder. Ad esempio, un pannello con i pulsanti Successivo, Precedente, Fine per navigare tra i campi di input. Appare e si nasconde insieme alla tastiera, sincronizzandosi con lo stato di first responder.
| Evento | Stato first responder | Tastiera |
|---|---|---|
| Toccare UITextField | Diventa first responder | Appare |
| Premere Invio | Rimane o resign | Rimane o si nasconde |
| Toccare un altro campo | Passa al nuovo campo | Cambia |
| Chiamare resignFirstResponder | Rimosso | Si nasconde |
| App in background | Resign automaticamente | Si nasconde |
ResignFirstResponder è un metodo UIResponder che rimuove lo stato di first responder da un oggetto. Dopo la chiamata, l'oggetto smette di ricevere eventi di input e la tastiera (se era attiva) si nasconde. Il metodo restituisce un Bool — true se il resign è riuscito.
Gli sviluppatori chiamano spesso resignFirstResponder in risposta alla pressione del pulsante Fine, al tocco di un'area vuota dello schermo (view.endEditing) o quando si esce dallo schermo. view.endEditing(true) è un modo comodo per resign per tutti i campi di testo figli contemporaneamente: attraversa l'intera gerarchia delle viste e chiama resignFirstResponder sul first responder corrente.
// Resign sul pulsante Fine
@objc func doneButtonTapped() {
textField.resignFirstResponder()
}
// Resign sul tocco area vuota
override func touchesBegan(
_ touches: Set<UITouch>,
with event: UIEvent?
) {
view.endEditing(true)
}
// Resign per tutti i campi del modulo
func validateAndSubmit() {
view.endEditing(true)
// Logica di invio del modulo
}
Esistono situazioni in cui resignFirstResponder può restituire false. Ciò accade se l'oggetto ha sovrascritto il metodo e ha esplicitamente impedito la rimozione dello stato. Ad esempio, un campo di testo in fase di validazione può bloccare temporaneamente il resign per evitare la perdita di dati. In tali casi, attendere il completamento della validazione e solo allora resign forzatamente.
UIResponder fornisce la proprietà isFirstResponder (sola lettura), che restituisce true se l'oggetto specificato è attualmente il first responder. Ciò è utile per la logica condizionale — ad esempio, per evitare di eseguire un'azione se un campo di testo è focalizzato e l'utente sta inserendo dati.
iOS non fornisce un'API integrata per ottenere il first responder corrente a livello di intera applicazione. Gli sviluppatori ottengono questo risultato attraversando la gerarchia delle viste utilizzando il metodo UIResponder. Apple raccomanda un riferimento debole (weak reference) al first responder, che può essere aggiornato tramite KVO o delegati.
// Estensione per trovare first responder
extension UIView {
var firstResponder: UIResponder? {
guard isFirstResponder else {
return subviews.compactMap { $0.firstResponder }.first
}
return self
}
}
// Utilizzo
if let current = view.firstResponder {
print("Current first responder: \(current)")
}
Per il tracciamento dei cambiamenti del first responder, è possibile sottoscriversi a UIResponder.keyboardWillShowNotification e UIResponder.keyboardWillHideNotification — indicano indirettamente che un oggetto di testo è diventato o ha smesso di essere first responder. Tuttavia, non esiste una sottoscrizione diretta per i cambiamenti di isFirstResponder; vengono utilizzati KVO o delegati personalizzati.
Le viste personalizzate possono diventare first responder se sovrascrivono canBecomeFirstResponder e restituiscono true. Ciò è necessario per i componenti che devono ricevere eventi della tastiera o di pulsanti fisici — ad esempio, controller di gioco personalizzati o editor di codice basati su UITextView.
Quando si crea un first responder personalizzato, è importante tenere conto dell'accessibilità: VoiceOver e Switch Control si basano sulla corretta assegnazione del first responder per la navigazione. Se una vista personalizzata diventa first responder, deve implementare correttamente il protocollo UIAccessibility e segnalare il suo stato alle tecnologie assistive.
Per input personalizzato (ad esempio, uno scanner di codici a barre o un tastierino numerico), sovrascrivere la proprietà inputView — restituire una UIView personalizzata che verrà visualizzata al posto della tastiera standard quando questa vista è first responder. Analogamente, inputAccessoryView aggiunge un pannello sopra la tastiera.
Domande frequenti
First Responder è l'oggetto UIResponder che attualmente riceve gli eventi di input (tocco, tasti, accelerometro). Viene assegnato tramite becomeFirstResponder e deve restituire true da canBecomeFirstResponder. Solo un oggetto può essere first responder in un'applicazione.
Chiamare textField.becomeFirstResponder() tramite programmazione, ad esempio, in viewDidAppear. Assicurarsi che textField non sia nascosto, userInteractionEnabled = true e isEnabled = true. Se il campo si trova all'interno di un UITableView o UICollectionView, assicurarsi che la cella sia visibile sullo schermo.
Aggiungere un UITapGestureRecognizer alla vista principale e chiamare view.endEditing(true) nel suo gestore. Questo troverà automaticamente il first responder corrente e chiamerà resignFirstResponder. In alternativa, sovrascrivere touchesBegan in UIViewController con una chiamata a endEditing.
becomeFirstResponder restituisce false se canBecomeFirstResponder restituisce false, la vista è nascosta, non è nella gerarchia della finestra o userInteractionEnabled = false. Verificare anche che la vista sia aggiunta alla finestra — una vista non visualizzata sullo schermo non risponderà a becomeFirstResponder.
iOS non fornisce un'API globale per questo. Utilizzare un attraversamento ricorsivo della gerarchia delle viste tramite un'estensione UIView che verifica isFirstResponder su ogni sotto-vista. Un'alternativa è memorizzare un riferimento debole all'ultimo first responder in AppDelegate e aggiornarlo tramite i delegati UITextField.
Riepilogo
Svilupperemo un'applicazione mobile chiavi in mano
IT Sectr crea applicazioni iOS e Android per startup e aziende dal 2017. Ti consulteremo e ti proporremo la soluzione migliore.
Leggi anche