First Responder — este un obiect UIResponder în iOS care primește primul evenimente de atingere, apăsări de taste, gesturi shake și comenzi de meniu. În fiecare moment, doar un obiect din aplicație poate fi first responder. Atribuirea are loc automat (la focusul UITextField) sau programatic prin metoda becomeFirstResponder. Conform Apple Developer Documentation (2026), un obiect poate deveni first responder doar dacă metoda sa canBecomeFirstResponder returnează true, ceea ce face acest mecanism explicit și controlabil.
Principalele puncte
First Responder — este un obiect UIResponder care în prezent primește evenimente de intrare într-o aplicație iOS. Sistemul direcționează toate evenimentele de atingere, apăsările de taste, evenimentele de mișcare (scuturarea dispozitivului) și mesajele de acțiune (de exemplu, apelarea meniului contextual) exact către acest obiect.
Conceptul de first responder este prima verigă în Responder Chain. Dacă first responder nu procesează evenimentul primit, acesta este transmis automat următorului obiect din lanț. Acest lucru garantează că evenimentul nu se pierde, ci este oferit succesiv tuturor potențialilor procesatori din ierarhie.
Conform Apple, statutul de first responder este strâns legat de UIResponder și metodele sale canBecomeFirstResponder și becomeFirstResponder. În mod implicit, UIView returnează true doar pentru anumite subclase — UITextField, UITextView, UISearchBar. Alte vizualizări, inclusiv UIView obișnuit, returnează false, ceea ce previne atribuirea accidentală.
Atribuirea first responder poate avea loc în două moduri: automat, când utilizatorul atinge UITextField (sistemul apelează becomeFirstResponder intern), sau programatic, când dezvoltatorul apelează explicit metoda becomeFirstResponder pe orice obiect UIResponder.
Înainte de atribuire, iOS verifică canBecomeFirstResponder. Dacă metoda returnează false, apelul becomeFirstResponder este ignorat, iar obiectul nu devine first responder. Acesta este un mecanism de protecție care previne atribuirea obiectelor care nu sunt pregătite să proceseze evenimente — de exemplu, elemente de interfață ascunse sau dezactivate.
class CustomTextField: UITextField {
override var canBecomeFirstResponder: Bool {
return super.canBecomeFirstResponder
}
}
// Atribuire programatică
textField.becomeFirstResponder()
// Verificare first responder
if textField.isFirstResponder {
print("TextField este acum first responder")
}
La atribuirea unui nou first responder, iOS apelează automat resignFirstResponder la cel anterior. Acest lucru garantează că în sistem există întotdeauna un singur obiect cu statut de first responder. Dacă noul obiect nu poate deveni first responder (canBecomeFirstResponder = false), cel vechi își păstrează statutul.
Tastatura iOS apare pe ecran tocmai datorită mecanismului first responder. Când UITextField sau UITextView devine first responder, sistemul afișează automat tastatura asociată cu keyboardType-ul curent al acestui câmp. La renunțarea first responder, tastatura este ascunsă.
Acest comportament este un mecanism cheie de UX în iOS: utilizatorul atinge câmpul de introducere — tastatura apare; apasă Return sau atinge un alt câmp — tastatura se comută sau se ascunde. Dezvoltatorul poate gestiona acest lucru prin metodele UIResponder, precum și prin inputView și inputAccessoryView pentru înlocuirea tastaturii standard cu una personalizată.
Input Accessory View — este un panou suplimentar deasupra tastaturii, care este, de asemenea, legat de first responder. De exemplu, un panou cu butoanele Next, Previous, Done pentru navigarea între câmpurile de introducere. Este afișat și ascuns împreună cu tastatura, sincronizându-se cu statutul first responder.
| Eveniment | Statut first responder | Tastatura |
|---|---|---|
| Atingerea UITextField | Devine first responder | Apare |
| Apăsarea Return | Rămâne sau renunță | Rămâne sau se ascunde |
| Atingerea altui câmp | Trece la noul câmp | Se comută |
| Apelarea resignFirstResponder | Eliminat | Se ascunde |
| Ascunderea aplicației | Renunță automat | Se ascunde |
ResignFirstResponder — este o metodă UIResponder care elimină statutul de first responder al unui obiect. După apel, obiectul încetează să primească evenimente de intrare, iar tastatura (dacă era activă) este ascunsă. Metoda returnează Bool — true dacă renunțarea a avut succes.
Dezvoltatorii apelează adesea resignFirstResponder ca răspuns la apăsarea butonului Done, atingerea unei zone goale a ecranului (view.endEditing) sau la părăsirea ecranului. view.endEditing(true) — este o modalitate convenabilă de a renunța pentru toate câmpurile text copil deodată: parcurge întreaga ierarhie de vizualizări și apelează resignFirstResponder la first responder-ul curent.
// Renunțare la apăsarea Done
@objc func doneButtonTapped() {
textField.resignFirstResponder()
}
// Renunțare la atingerea zonei goale
override func touchesBegan(
_ touches: Set<UITouch>,
with event: UIEvent?
) {
view.endEditing(true)
}
// Renunțare pentru toate câmpurile formularului
func validateAndSubmit() {
view.endEditing(true)
// Logica trimiterii formularului
}
Există situații în care resignFirstResponder poate returna false. Acest lucru se întâmplă dacă obiectul a suprascris metoda și a interzis explicit eliminarea statutului. De exemplu, un câmp text în curs de validare poate bloca temporar renunțarea pentru a preveni pierderea datelor. În astfel de cazuri, trebuie să așteptați finalizarea validării și abia apoi să forțați renunțarea.
UIResponder oferă proprietatea isFirstResponder (doar citire), care returnează true dacă obiectul dat este în prezent first responder. Acest lucru este util pentru logica condițională — de exemplu, pentru a nu executa o acțiune dacă câmpul text este în focus și utilizatorul introduce date.
iOS nu oferă o API încorporată pentru obținerea first responder-ului curent la scară întreagă a aplicației. Dezvoltatorii creează această capacitate prin parcurgerea ierarhiei de vizualizări folosind metoda UIResponder. Soluția Apple recomandă o referință slabă la first responder, care poate fi actualizată prin KVO sau delegări.
// Extensie pentru găsirea first responder
extension UIView {
var firstResponder: UIResponder? {
guard isFirstResponder else {
return subviews.compactMap { $0.firstResponder }.first
}
return self
}
}
// Utilizare
if let current = view.firstResponder {
print("Current first responder: \(current)")
}
Pentru urmărirea modificărilor first responder, vă puteți abona la notificările UIResponder.keyboardWillShowNotification și UIResponder.keyboardWillHideNotification — ele indică indirect că un obiect text a devenit sau a încetat să fie first responder. Cu toate acestea, nu există o abonare directă la modificarea isFirstResponder; pentru aceasta se folosește KVO sau delegări personalizate.
Vizualizările personalizate pot deveni first responder dacă suprascriu canBecomeFirstResponder și returnează true. Acest lucru este necesar pentru componentele care trebuie să primească evenimente de tastatură sau butoane fizice — de exemplu, controlere de joc personalizate sau editori de cod bazați pe UITextView.
La crearea unui first responder personalizat, este important să vă amintiți accesibilitatea: VoiceOver și Switch Control se bazează pe atribuirea corectă a first responder pentru navigare. Dacă o vizualizare personalizată devine first responder, aceasta trebuie să implementeze corect protocolul UIAccessibility și să informeze tehnologiile asistive despre statutul său.
Pentru intrare personalizată (de exemplu, scaner de coduri de bare sau tastatură numerică), suprascrieți proprietatea inputView — returnați un UIView personalizat care va fi afișat în locul tastaturii standard atunci când această vizualizare este first responder. În mod similar, inputAccessoryView adaugă un panou deasupra tastaturii.
Întrebări frecvente
First Responder — este un obiect UIResponder care în prezent primește evenimente de intrare (atingeri, taste, accelerometru). Este atribuit prin becomeFirstResponder, trebuie să returneze true din canBecomeFirstResponder. Doar un obiect poate fi first responder în aplicație.
Apelați textField.becomeFirstResponder() programatic, de exemplu, în viewDidAppear. Asigurați-vă că textField nu este ascuns, userInteractionEnabled = true și isEnabled = true. Dacă câmpul se află în UITableView sau UICollectionView, asigurați-vă că celula este vizibilă pe ecran.
Adăugați un UITapGestureRecognizer pe vizualizarea principală și în handlerul său apelați view.endEditing(true). Acesta va găsi automat first responder-ul curent și va apela resignFirstResponder. Alternativ, suprascrieți touchesBegan în UIViewController cu apelul endEditing.
becomeFirstResponder returnează false dacă canBecomeFirstResponder returnează false, vizualizarea este ascunsă, nu se află în ierarhia ferestrei sau userInteractionEnabled = false. De asemenea, verificați dacă vizualizarea a fost adăugată la fereastră — o vizualizare care nu se află pe ecran nu va funcționa cu becomeFirstResponder.
iOS nu oferă o API globală pentru aceasta. Utilizați parcurgerea recursivă a ierarhiei de vizualizări printr-o extensie UIView care verifică isFirstResponder la fiecare subview. Alternativă — păstrați o referință slabă la ultimul first responder în AppDelegate și actualizați-o prin delegări UITextField.
Concluzii
Vom dezvolta o aplicație mobilă la cheie
IT Sectr creează aplicații iOS și Android pentru startup-uri și afaceri din 2017. Vă vom consilia și vă vom propune cea mai bună soluție.
Citiți și