First Responder — är ett UIResponder-objekt i iOS som först tar emot beröringshändelser, tangenttryckningar, skakgester och menykommandon. Vid varje tillfälle kan endast ett objekt i appen vara first responder. Tilldelning sker automatiskt (vid fokus av UITextField) eller programmatiskt via metoden becomeFirstResponder. Enligt Apple Developer Documentation (2026) kan ett objekt endast bli first responder om dess metod canBecomeFirstResponder returnerar true, vilket gör denna mekanism explicit och kontrollerbar.
Huvudpunkter
First Responder — är ett UIResponder-objekt som för närvarande tar emot inmatningshändelser i en iOS-app. Systemet dirigerar alla beröringshändelser, tangenttryckningar, rörelsehändelser (skakning av enheten) och åtgärdsmeddelanden (t.ex. anrop av snabbmeny) till just detta objekt.
Konceptet first responder är den första länken i Responder Chain. Om first responder inte bearbetar en mottagen händelse, överförs den automatiskt till nästa objekt i kedjan. Detta garanterar att händelsen inte går förlorad, utan successivt erbjuds till alla potentiella bearbetare i hierarkin.
Enligt Apple är first responder-status nära kopplad till UIResponder och dess metoder canBecomeFirstResponder och becomeFirstResponder. Som standard returnerar UIView endast true för vissa underklasser — UITextField, UITextView, UISearchBar. Andra vyer, inklusive vanlig UIView, returnerar false, vilket förhindrar oavsiktlig tilldelning.
Tilldelning av first responder kan ske på två sätt: automatiskt, när användaren rör vid UITextField (systemet anropar internt becomeFirstResponder), eller programmatiskt, när utvecklaren uttryckligen anropar metoden becomeFirstResponder på ett UIResponder-objekt.
Före tilldelning kontrollerar iOS canBecomeFirstResponder. Om metoden returnerar false ignoreras anropet till becomeFirstResponder och objektet blir inte first responder. Detta är en skyddsmekanism som förhindrar tilldelning av objekt som inte är redo att bearbeta händelser — till exempel dolda eller inaktiverade gränssnittselement.
class CustomTextField: UITextField {
override var canBecomeFirstResponder: Bool {
return super.canBecomeFirstResponder
}
}
// Programmatisk tilldelning
textField.becomeFirstResponder()
// Kontrollera om first responder
if textField.isFirstResponder {
print("TextField är nu first responder")
}
Vid tilldelning av en ny first responder anropar iOS automatiskt resignFirstResponder på den föregående. Detta garanterar att det alltid finns endast ett objekt i systemet med first responder-status. Om det nya objektet inte kan bli first responder (canBecomeFirstResponder = false), behåller det gamla sin status.
iOS-tangentbordet visas på skärmen tack vare first responder-mekanismen. När UITextField eller UITextView blir first responder visar systemet automatiskt tangentbordet som är kopplat till fältets aktuella keyboardType. Vid avgång av first responder döljs tangentbordet.
Detta beteende är en viktig UX-mekanism i iOS: användaren rör vid ett inmatningsfält — tangentbordet visas; trycker på Return eller rör vid ett annat fält — tangentbordet växlar eller döljs. Utvecklaren kan hantera detta via UIResponder-metoder, samt via inputView och inputAccessoryView för att ersätta standardtangentbordet med ett anpassat.
Input Accessory View — är en extra panel ovanför tangentbordet, som också är bunden till first responder. Till exempel en panel med knapparna Next, Previous, Done för navigering mellan inmatningsfält. Den visas och döljs tillsammans med tangentbordet, synkroniserat med first responder-status.
| Händelse | First responder-status | Tangentbord |
|---|---|---|
| Beröring av UITextField | Blir first responder | Visas |
| Tryck på Return | Stannar eller avgår | Stannar eller döljs |
| Beröring av annat fält | Går över till nytt fält | Växlar |
| Anrop av resignFirstResponder | Borttagen | Döljs |
| Döljande av app | Avgår automatiskt | Döljs |
ResignFirstResponder — är en UIResponder-metod som tar bort first responder-status från ett objekt. Efter anrop slutar objektet att ta emot inmatningshändelser och tangentbordet (om aktivt) döljs. Metoden returnerar Bool — true om avgången lyckades.
Utvecklare anropar ofta resignFirstResponder som svar på att Done-knappen trycks, beröring av ett tomt område på skärmen (view.endEditing) eller när skärmen lämnas. view.endEditing(true) — är ett bekvämt sätt att avgå för alla underordnade textfält samtidigt: det går igenom hela vyhierarkin och anropar resignFirstResponder på den aktuella first responder.
// Avgång vid tryck på Done
@objc func doneButtonTapped() {
textField.resignFirstResponder()
}
// Avgång vid beröring av tomt område
override func touchesBegan(
_ touches: Set<UITouch>,
with event: UIEvent?
) {
view.endEditing(true)
}
// Avgång för alla formulärfält
func validateAndSubmit() {
view.endEditing(true)
// Logik för formulärinskickning
}
Det finns situationer där resignFirstResponder kan returnera false. Detta inträffar om objektet har åsidosatt metoden och uttryckligen förbjudit borttagning av status. Till exempel kan ett textfält under validering tillfälligt blockera avgång för att förhindra dataförlust. I sådana fall måste man vänta på att valideringen slutförs och först därefter tvinga avgång.
UIResponder tillhandahåller egenskapen isFirstResponder (skrivskyddad), som returnerar true om det givna objektet för närvarande är first responder. Detta är användbart för villkorlig logik — till exempel för att inte utföra en åtgärd om ett textfält är i fokus och användaren matar in data.
iOS tillhandahåller inget inbyggt API för att hämta den aktuella first responder i hela applikationen. Utvecklare skapar denna funktion genom att gå igenom vyhierarkin med UIResponder-metoden. Apples lösning rekommenderar en svag referens till first responder, som kan uppdateras via KVO eller delegater.
// Tillägg för att hitta first responder
extension UIView {
var firstResponder: UIResponder? {
guard isFirstResponder else {
return subviews.compactMap { $0.firstResponder }.first
}
return self
}
}
// Användning
if let current = view.firstResponder {
print("Current first responder: \(current)")
}
För spårning av ändringar av first responder kan man prenumerera på aviseringarna UIResponder.keyboardWillShowNotification och UIResponder.keyboardWillHideNotification — de indikerar indirekt att ett textobjekt har blivit eller slutat vara first responder. Det finns dock ingen direkt prenumeration på ändring av isFirstResponder; för detta används KVO eller anpassade delegater.
Anpassade vyer kan bli first responder om de åsidosätter canBecomeFirstResponder och returnerar true. Detta är nödvändigt för komponenter som måste ta emot tangentbords- eller fysiska knapphändelser — till exempel anpassade spelkontroller eller kodredigerare baserade på UITextView.
När du skapar en anpassad first responder är det viktigt att komma ihåg tillgänglighet: VoiceOver och Switch Control förlitar sig på korrekt tilldelning av first responder för navigering. Om en anpassad vy blir first responder måste den korrekt implementera UIAccessibility-protokollet och informera hjälpmedelsteknik om sin status.
För anpassad inmatning (till exempel streckkodsläsare eller numeriskt tangentbord) åsidosätter du egenskapen inputView — returnera en anpassad UIView som visas istället för standardtangentbordet när denna vy är first responder. På liknande sätt lägger inputAccessoryView till en panel ovanför tangentbordet.
Vanliga frågor
First Responder — är ett UIResponder-objekt som för närvarande tar emot inmatningshändelser (beröringar, tangenter, accelerometer). Det tilldelas via becomeFirstResponder, måste returnera true från canBecomeFirstResponder. Endast ett objekt kan vara first responder i appen.
Anropa textField.becomeFirstResponder() programmatiskt, till exempel i viewDidAppear. Se till att textField inte är dold, userInteractionEnabled = true och isEnabled = true. Om fältet finns i UITableView eller UICollectionView, se till att cellen är synlig på skärmen.
Lägg till en UITapGestureRecognizer på huvudvyn och anropa view.endEditing(true) i dess hanterare. Detta hittar automatiskt den aktuella first responder och anropar resignFirstResponder. Alternativt kan du åsidosätta touchesBegan i UIViewController med ett anrop till endEditing.
becomeFirstResponder returnerar false om canBecomeFirstResponder returnerar false, vyn är dold, inte i fönsterhierarkin eller userInteractionEnabled = false. Kontrollera också om vyn har lagts till i fönstret — en vy som inte finns på skärmen fungerar inte med becomeFirstResponder.
iOS tillhandahåller inget globalt API för detta. Använd rekursiv genomgång av vyhierarkin via en UIView-tillägg som kontrollerar isFirstResponder på varje undervy. Alternativ — lagra en svag referens till den senaste first responder i AppDelegate och uppdatera den via UITextField-delegater.
Sammanfattning
Vi utvecklar en mobil applikation nyckelfärdigt
IT Sectr skapar iOS- och Android-applikationer för startups och företag sedan 2017. Vi ger dig råd och föreslår den bästa lösningen.
Läs också