First Responder — egy UIResponder objektum iOS-ben, amely elsőként kapja meg az érintési eseményeket, billentyűlenyomásokat, rázási gesztusokat és menüparancsokat. Minden pillanatban csak egy objektum lehet first responder az alkalmazásban. A kijelölés automatikusan (UITextField fókusz esetén) vagy programozottan a becomeFirstResponder metóduson keresztül történik. A Apple Developer Documentation (2026) szerint egy objektum csak akkor válhat first responder-ré, ha a canBecomeFirstResponder metódusa true-t ad vissza, ami ezt a mechanizmust egyértelművé és ellenőrizhetővé teszi.
Főbb pontok
First Responder — egy UIResponder objektum, amely jelenleg beviteli eseményeket fogad egy iOS-alkalmazásban. A rendszer az összes érintési eseményt, billentyűlenyomást, mozgási eseményt (az eszköz megrázása) és műveleti üzenetet (pl. helyi menü meghívása) pontosan ehhez az objektumhoz irányítja.
A first responder koncepció az első láncszem a Responder Chain-ben. Ha a first responder nem dolgozza fel a kapott eseményt, az automatikusan továbbítódik a lánc következő objektumának. Ez garantálja, hogy az esemény nem vész el, hanem egymás után felkínálásra kerül az összes potenciális feldolgozónak a hierarchiában.
Az Apple szerint a first responder státusz szorosan kapcsolódik a UIResponder-hez és annak canBecomeFirstResponder és becomeFirstResponder metódusaihoz. Alapértelmezés szerint a UIView csak bizonyos alosztályok esetén ad vissza true-t — UITextField, UITextView, UISearchBar. Más nézetek, beleértve a sima UIView-t, false-t adnak vissza, ami megakadályozza a véletlen kijelölést.
Kijelölés a first responder kétféleképpen történhet: automatikusan, amikor a felhasználó megérint egy UITextField-et (a rendszer belsőleg meghívja a becomeFirstResponder-t), vagy programozottan, amikor a fejlesztő kifejezetten meghívja a becomeFirstResponder metódust bármely UIResponder objektumon.
A kijelölés előtt az iOS ellenőrzi a canBecomeFirstResponder-t. Ha a metódus false-t ad vissza, a becomeFirstResponder hívása figyelmen kívül lesz hagyva, és az objektum nem válik first responder-ré. Ez egy védelmi mechanizmus, amely megakadályozza azon objektumok kijelölését, amelyek nem állnak készen az események feldolgozására — például rejtett vagy letiltott felületi elemek.
class CustomTextField: UITextField {
override var canBecomeFirstResponder: Bool {
return super.canBecomeFirstResponder
}
}
// Programozott kijelölés
textField.becomeFirstResponder()
// First responder ellenőrzése
if textField.isFirstResponder {
print("A TextField most first responder")
}
Egy új first responder kijelölésekor az iOS automatikusan meghívja a resignFirstResponder-t az előzőn. Ez garantálja, hogy a rendszerben mindig csak egy objektum rendelkezik first responder státusszal. Ha az új objektum nem válhat first responder-ré (canBecomeFirstResponder = false), a régi megtartja státuszát.
Az iOS billentyűzet a first responder mechanizmusának köszönhetően jelenik meg a képernyőn. Amikor egy UITextField vagy UITextView first responder-ré válik, a rendszer automatikusan megjeleníti az adott mező aktuális keyboardType-jához tartozó billentyűzetet. A first responder lemondásakor a billentyűzet elrejtésre kerül.
Ez a viselkedés egy kulcsfontosságú UX mechanizmus iOS-ben: a felhasználó megérint egy beviteli mezőt — a billentyűzet megjelenik; megnyomja a Return-t vagy megérint egy másik mezőt — a billentyűzet átkapcsol vagy elrejtőzik. A fejlesztő ezt a UIResponder metódusokon, valamint az inputView és inputAccessoryView segítségével kezelheti a szabványos billentyűzet egyedi billentyűzetre cseréléséhez.
Input Accessory View — egy kiegészítő panel a billentyűzet felett, amely szintén a first responder-hez van kötve. Például egy panel Next, Previous, Done gombokkal a beviteli mezők közötti navigációhoz. A billentyűzettel együtt jelenik meg és rejtőzik el, szinkronizálva a first responder státusszal.
| Esemény | First responder státusz | Billentyűzet |
|---|---|---|
| UITextField érintése | First responder lesz | Megjelenik |
| Return megnyomása | Marad vagy lemond | Marad vagy elrejtőzik |
| Másik mező érintése | Átmegy az új mezőre | Átkapcsol |
| resignFirstResponder hívása | Eltávolításra kerül | Elrejtőzik |
| Alkalmazás elrejtése | Automatikusan lemond | Elrejtőzik |
ResignFirstResponder — egy UIResponder metódus, amely eltávolítja a first responder státuszt az objektumról. A hívás után az objektum leállítja a beviteli események fogadását, és a billentyűzet (ha aktív volt) elrejtésre kerül. A metódus Bool-t ad vissza — true, ha a lemondás sikeres volt.
A fejlesztők gyakran hívják a resignFirstResponder-t válaszul a Done gomb megnyomására, a képernyő üres területének érintésére (view.endEditing) vagy a képernyő elhagyásakor. view.endEditing(true) — egy kényelmes módja az összes gyermek szöveges mező egyidejű lemondásának: végigjárja a teljes nézethierarchiát és meghívja a resignFirstResponder-t az aktuális first responder-en.
// Lemondás Done gomb megnyomásakor
@objc func doneButtonTapped() {
textField.resignFirstResponder()
}
// Lemondás üres terület érintésekor
override func touchesBegan(
_ touches: Set<UITouch>,
with event: UIEvent?
) {
view.endEditing(true)
}
// Lemondás az összes űrlapmezőre
func validateAndSubmit() {
view.endEditing(true)
// Űrlapbeküldési logika
}
Vannak olyan helyzetek, amikor a resignFirstResponder false-t adhat vissza. Ez akkor történik, ha az objektum felülírta a metódust és kifejezetten megtiltotta a státusz eltávolítását. Például egy érvényesítés alatt álló szöveges mező ideiglenesen blokkolhatja a lemondást az adatvesztés megelőzése érdekében. Ilyen esetekben meg kell várni az érvényesítés befejezését, és csak azután kényszeríteni a lemondást.
UIResponder biztosítja az isFirstResponder tulajdonságot (csak olvasható), amely true-t ad vissza, ha az adott objektum jelenleg first responder. Ez hasznos feltételes logikához — például hogy ne hajtson végre egy műveletet, ha egy szöveges mező fókuszban van és a felhasználó adatokat ír be.
Az iOS nem biztosít beépített API-t az aktuális first responder lekéréséhez az egész alkalmazásra kiterjedően. A fejlesztők ezt a képességet a nézethierarchia bejárásával hozzák létre a UIResponder metódus segítségével. Az Apple megoldása egy gyenge hivatkozást javasol a first responder-re, amely KVO-n vagy delegáltakon keresztül frissíthető.
// Kiterjesztés a first responder megtalálásához
extension UIView {
var firstResponder: UIResponder? {
guard isFirstResponder else {
return subviews.compactMap { $0.firstResponder }.first
}
return self
}
}
// Használat
if let current = view.firstResponder {
print("Current first responder: \(current)")
}
A first responder változásainak nyomon követéséhez fel lehet iratkozni a UIResponder.keyboardWillShowNotification és UIResponder.keyboardWillHideNotification értesítésekre — ezek közvetve jelzik, hogy egy szöveges objektum first responder-ré vált vagy megszűnt az lenni. Az isFirstResponder változására azonban nincs közvetlen feliratkozás; ehhez KVO-t vagy egyedi delegáltakat használnak.
Egyedi nézetek first responder-ré válhatnak, ha felülírják a canBecomeFirstResponder-t és true-t adnak vissza. Ez szükséges azon komponensek számára, amelyeknek billentyűzet- vagy fizikai gombeseményeket kell fogadniuk — például egyedi játékvezérlők vagy UITextView-alapú kódszerkesztők.
Egyéni first responder létrehozásakor fontos emlékezni az akadálymentesítésre: a VoiceOver és a Switch Control a first responder helyes kijelölésére támaszkodik a navigációhoz. Ha egy egyedi nézet first responder-ré válik, megfelelően kell implementálnia az UIAccessibility protokollt, és tájékoztatnia kell a segítő technológiákat a státuszáról.
Egyéni bevitelhez (pl. vonalkód-olvasó vagy numerikus billentyűzet) írja felül az inputView tulajdonságot — adjon vissza egy egyedi UIView-t, amely a szabványos billentyűzet helyett jelenik meg, amikor ez a nézet first responder. Hasonlóképpen, az inputAccessoryView egy panelt ad a billentyűzet fölé.
Gyakran Ismételt Kérdések
First Responder — egy UIResponder objektum, amely jelenleg beviteli eseményeket fogad (érintések, billentyűk, gyorsulásmérő). A becomeFirstResponder segítségével kerül kijelölésre, true-t kell visszaadnia a canBecomeFirstResponder-ből. Csak egy objektum lehet first responder az alkalmazásban.
Hívja meg a textField.becomeFirstResponder() programozottan, például a viewDidAppear-ben. Győződjön meg róla, hogy a textField nincs elrejtve, userInteractionEnabled = true, és isEnabled = true. Ha a mező UITableView-ben vagy UICollectionView-ben van, győződjön meg róla, hogy a cella látható a képernyőn.
Adjon hozzá egy UITapGestureRecognizer-t a fő nézethez, és a kezelőjében hívja meg a view.endEditing(true)-t. Ez automatikusan megtalálja az aktuális first responder-t és meghívja a resignFirstResponder-t. Alternatív megoldásként írja felül a touchesBegan-t a UIViewController-ben az endEditing hívással.
A becomeFirstResponder false-t ad vissza, ha a canBecomeFirstResponder false-t ad vissza, a nézet rejtett, nincs az ablak hierarchiában, vagy userInteractionEnabled = false. Ellenőrizze azt is, hogy a nézet hozzá lett-e adva az ablakhoz — a képernyőn nem lévő nézet nem fog működni a becomeFirstResponder-rel.
Az iOS nem biztosít globális API-t ehhez. Használja a nézethierarchia rekurzív bejárását egy UIView kiterjesztésen keresztül, amely minden alnézetnél ellenőrzi az isFirstResponder-t. Alternatíva — tároljon egy gyenge hivatkozást az utolsó first responder-re az AppDelegate-ben, és frissítse azt UITextField delegáltakon keresztül.
Összegzés
Kulcsrakész mobilalkalmazást fejlesztünk
Az IT Sectr 2017 óta készít iOS és Android alkalmazásokat induló vállalkozásoknak és vállalkozásoknak. Tanácsot adunk, és a legjobb megoldást javasoljuk.
Olvassa el is