First Responder — je objekt UIResponder v iOS, který jako první přijímá události dotyku, stisky kláves, gesta třesení a příkazy menu. V každém okamžiku může být v aplikaci first responder pouze jeden objekt. Přiřazení probíhá automaticky (při fokusu UITextField) nebo programově pomocí metody becomeFirstResponder. Podle Apple Developer Documentation (2026) se objekt může stát first responder pouze pokud jeho metoda canBecomeFirstResponder vrací true, což činí tento mechanismus explicitním a kontrolovatelným.
Hlavní body
First Responder — je objekt UIResponder, který aktuálně přijímá vstupní události v iOS aplikaci. Systém směruje všechny události dotyku, stisky kláves, pohybové události (třesení zařízení) a akční zprávy (např. volání kontextové nabídky) právě tomuto objektu.
Koncept first responder je prvním článkem v Responder Chain. Pokud first responder zpracovávanou událost nezpracuje, je automaticky předána dalšímu objektu v řetězci. To zajišťuje, že událost není ztracena, ale je postupně nabízena všem potenciálním zpracovatelům v hierarchii.
Podle Apple je status first responder úzce spojen s UIResponder a jeho metodami canBecomeFirstResponder a becomeFirstResponder. Ve výchozím nastavení UIView vrací true pouze pro určité podtřídy — UITextField, UITextView, UISearchBar. Ostatní zobrazení, včetně běžného UIView, vracejí false, což zabraňuje náhodnému přiřazení.
Přiřazení first responder může proběhnout dvěma způsoby: automaticky, když uživatel dotkne UITextField (systém interně volá becomeFirstResponder), nebo programově, když vývojář explicitně zavolá metodu becomeFirstResponder na libovolném objektu UIResponder.
Před přiřazením iOS kontroluje canBecomeFirstResponder. Pokud metoda vrací false, volání becomeFirstResponder je ignorováno a objekt se nestane first responder. Toto je ochranný mechanismus zabraňující přiřazení objektů, které nejsou připraveny zpracovávat události — například skrytých nebo deaktivovaných prvků rozhraní.
class CustomTextField: UITextField {
override var canBecomeFirstResponder: Bool {
return super.canBecomeFirstResponder
}
}
// Programové přiřazení
textField.becomeFirstResponder()
// Kontrola, zda je first responder
if textField.isFirstResponder {
print("TextField je nyní first responder")
}
Při přiřazení nového first responder iOS automaticky volá resignFirstResponder u předchozího. To zajišťuje, že v systému je vždy pouze jeden objekt se statusem first responder. Pokud se nový objekt nemůže stát first responder (canBecomeFirstResponder = false), starý si ponechá svůj status.
Klávesnice iOS se objevuje na obrazovce právě díky mechanismu first responder. Když se UITextField nebo UITextView stane first responder, systém automaticky zobrazí klávesnici spojenou s aktuálním keyboardType tohoto pole. Při rezignaci first responder je klávesnice skryta.
Toto chování je klíčový UX mechanismus v iOS: uživatel se dotkne vstupního pole — klávesnice se objeví; stiskne Return nebo se dotkne jiného pole — klávesnice se přepne nebo skryje. Vývojář to může řídit pomocí metod UIResponder, stejně jako pomocí inputView a inputAccessoryView pro nahrazení standardní klávesnice vlastní.
Input Accessory View — je další panel nad klávesnicí, který je také vázán na first responder. Například panel s tlačítky Next, Previous, Done pro navigaci mezi vstupními poli. Zobrazuje se a skrývá spolu s klávesnicí, synchronizován se statusem first responder.
| Událost | Status first responder | Klávesnice |
|---|---|---|
| Dotek UITextField | Stává se first responder | Objeví se |
| Stisk Return | Zůstává nebo rezignuje | Zůstává nebo se skryje |
| Dotek jiného pole | Přechází na nové pole | Přepne se |
| Volání resignFirstResponder | Odebrán | Skryje se |
| Skrytí aplikace | Automaticky rezignuje | Skryje se |
ResignFirstResponder — je metoda UIResponder, která odebere status first responder z objektu. Po volání objekt přestane přijímat vstupní události a klávesnice (pokud byla aktivní) je skryta. Metoda vrací Bool — true, pokud byla rezignace úspěšná.
Vývojáři často volají resignFirstResponder v reakci na stisk tlačítka Done, dotyk prázdné oblasti obrazovky (view.endEditing) nebo při opuštění obrazovky. view.endEditing(true) — je pohodlný způsob rezignace pro všechna podřízená textová pole najednou: prochází celou hierarchii zobrazení a volá resignFirstResponder u aktuálního first responder.
// Rezignace při stisku Done
@objc func doneButtonTapped() {
textField.resignFirstResponder()
}
// Rezignace při dotyku prázdné oblasti
override func touchesBegan(
_ touches: Set<UITouch>,
with event: UIEvent?
) {
view.endEditing(true)
}
// Rezignace pro všechna pole formuláře
func validateAndSubmit() {
view.endEditing(true)
// Logika odeslání formuláře
}
Existují situace, kdy může resignFirstResponder vrátit false. To se stane, pokud objekt přepsal metodu a explicitně zakázal odebrání statusu. Například textové pole v procesu validace může dočasně blokovat rezignaci, aby zabránilo ztrátě dat. V takových případech je třeba počkat na dokončení validace a teprve poté vynutit rezignaci.
UIResponder poskytuje vlastnost isFirstResponder (jen pro čtení), která vrací true, pokud je daný objekt aktuálně first responder. To je užitečné pro podmíněnou logiku — například neprovádět akci, pokud je textové pole ve fokusu a uživatel zadává data.
iOS neposkytuje vestavěné API pro získání aktuálního first responder v měřítku celé aplikace. Vývojáři vytvářejí tuto možnost pomocí průchodu hierarchií zobrazení pomocí metody UIResponder. Řešení Apple doporučuje slabý odkaz na first responder, který lze aktualizovat pomocí KVO nebo delegátů.
// Rozšíření pro nalezení first responder
extension UIView {
var firstResponder: UIResponder? {
guard isFirstResponder else {
return subviews.compactMap { $0.firstResponder }.first
}
return self
}
}
// Použití
if let current = view.firstResponder {
print("Current first responder: \(current)")
}
Pro sledování změn first responder se můžete přihlásit k odběru oznámení UIResponder.keyboardWillShowNotification a UIResponder.keyboardWillHideNotification — nepřímo indikují, že se nějaký textový objekt stal nebo přestal být first responder. Neexistuje však přímé předplatné změny isFirstResponder; k tomu se používá KVO nebo vlastní delegáti.
Vlastní zobrazení se mohou stát first responder, pokud přepíší canBecomeFirstResponder a vrátí true. To je nezbytné pro komponenty, které musí přijímat události klávesnice nebo fyzických tlačítek — například vlastní herní ovladače nebo editory kódu založené na UITextView.
Při vytváření vlastního first responder je důležité pamatovat na přístupnost: VoiceOver a Switch Control spoléhají na správné přiřazení first responder pro navigaci. Pokud se vlastní zobrazení stane first responder, musí správně implementovat protokol UIAccessibility a informovat asistenční technologie o svém statusu.
Pro vlastní vstup (například skener čárových kódů nebo numerická klávesnice) přepište vlastnost inputView — vraťte vlastní UIView, který se zobrazí místo standardní klávesnice, když je toto zobrazení first responder. Podobně inputAccessoryView přidá panel nad klávesnici.
Často kladené otázky
First Responder — je objekt UIResponder, který aktuálně přijímá vstupní události (dotyky, klávesy, akcelerometr). Je přiřazován pomocí becomeFirstResponder, musí vracet true z canBecomeFirstResponder. Pouze jeden objekt může být first responder v aplikaci.
Zavolejte textField.becomeFirstResponder() programově, například v viewDidAppear. Ujistěte se, že textField není skrytý, userInteractionEnabled = true a isEnabled = true. Pokud je pole v UITableView nebo UICollectionView, ujistěte se, že je buňka viditelná na obrazovce.
Přidejte UITapGestureRecognizer na hlavní zobrazení a v jeho handleru zavolejte view.endEditing(true). To automaticky najde aktuální first responder a zavolá resignFirstResponder. Alternativně přepište touchesBegan v UIViewController s voláním endEditing.
becomeFirstResponder vrací false, pokud canBecomeFirstResponder vrací false, zobrazení je skryté, není v hierarchii okna nebo userInteractionEnabled = false. Také zkontrolujte, zda bylo zobrazení přidáno do okna — zobrazení, které není na obrazovce, nebude s becomeFirstResponder fungovat.
iOS neposkytuje globální API pro toto. Použijte rekurzivní průchod hierarchií zobrazení pomocí rozšíření UIView, které kontroluje isFirstResponder u každého subview. Alternativa — uchovávejte slabý odkaz na poslední first responder v AppDelegate a aktualizujte jej pomocí delegátů UITextField.
Shrnutí
Vyvineme mobilní aplikaci na klíč
IT Sectr vytváří aplikace pro iOS a Android pro startupy a podniky od roku 2017. Poradíme vám a navrhneme nejlepší řešení.
Přečtěte si také