First Responder — је објект UIResponder у iOS-у који први прима догађаје додира, притисака тастера, покрета трешења и команди менија. У сваком тренутку само један објект у апликацији може бити first responder. Постављање се дешава аутоматски (при фокусу UITextField-а) или програмски преко метода becomeFirstResponder. Према Apple Developer Documentation (2026), објект може постати first responder само ако његов метод canBecomeFirstResponder враћа true, што чини овај механизам експлицитним и контролисаним.
Главно
First Responder — је објект UIResponder који тренутно прима догађаје уноса у iOS апликацији. Систем усмерава све догађаје додира, притиске тастера, покретне догађаје (трешење уређаја) и поруке акције (нпр. позивање контекстног менија) управо овом објекту.
Концепт first responder-а је прва карика у Responder Chain-у. Ако first responder не обради примљени догађај, он се аутоматски преноси следећем објекту у ланцу. Ово гарантује да се догађај не изгуби, већ да се сукцесивно нуди свим потенцијалним обрађивачима у хијерархији.
Према Apple-у, статус first responder-а је уско повезан са UIResponder-ом и његовим методима canBecomeFirstResponder и becomeFirstResponder. Подразумевано, UIView враћа true само за одређене подкласе — UITextField, UITextView, UISearchBar. Други прикази, укључујући обични UIView, враћају false, што спречава случајно постављање.
Постављање first responder-а може се десити на два начина: аутоматски, када корисник додирне UITextField (систем интерно позива becomeFirstResponder), или програмски, када програмер експлицитно позове метод becomeFirstResponder на било ком UIResponder објекту.
Пре постављања, iOS проверава canBecomeFirstResponder. Ако метод врати false, позив becomeFirstResponder се игнорише и објект не постаје first responder. Ово је заштитни механизам који спречава постављање објеката који нису спремни за обраду догађаја — на пример, скривених или онемогућених елемената интерфејса.
class CustomTextField: UITextField {
override var canBecomeFirstResponder: Bool {
return super.canBecomeFirstResponder
}
}
// Програмско постављање
textField.becomeFirstResponder()
// Провера first responder-а
if textField.isFirstResponder {
print("TextField је сада first responder")
}
При постављању новог first responder-а, iOS аутоматски позива resignFirstResponder код претходног. Ово гарантује да у систему увек постоји само један објект са статусом first responder. Ако нови објект не може постати first responder (canBecomeFirstResponder = false), стари задржава свој статус.
iOS тастатура се појављује на екрану управо захваљујући механизму first responder-а. Када UITextField или UITextView постане first responder, систем аутоматски приказује тастатуру повезану са тренутним keyboardType-ом тог поља. При одрицању first responder-а, тастатура се сакрива.
Ово понашање је кључни UX механизам у iOS-у: корисник додирне поље за унос — тастатура се појављује; притисне Return или додирне друго поље — тастатура се пребацује или сакрива. Програмер може управљати овим путем UIResponder метода, као и путем inputView и inputAccessoryView за замену стандардне тастатуре прилагођеном.
Input Accessory View — је додатни панел изнад тастатуре, који је такође везан за first responder. На пример, панел са дугмићима Next, Previous, Done за навигацију између поља за унос. Приказује се и сакрива заједно са тастатуром, синхронизујући се са статусом first responder-а.
| Догађај | Статус first responder-а | Тастатура |
|---|---|---|
| Додир UITextField-а | Постаје first responder | Појављује се |
| Притисак Return | Остаје или се одриче | Остаје или се сакрива |
| Додир другог поља | Прелази на ново поље | Пребацује се |
| Позив resignFirstResponder | Уклања се | Сакрива се |
| Сакривање апликације | Аутоматски се одриче | Сакрива се |
ResignFirstResponder — је метод UIResponder-а који уклања статус first responder са објекта. Након позива, објект престаје да прима догађаје уноса, а тастатура (ако је била активна) се сакрива. Метод враћа Bool — true ако је одрицање успешно.
Програмери често позивају resignFirstResponder као одговор на притисак дугмета Done, додир празне области екрана (view.endEditing) или при напуштању екрана. view.endEditing(true) — је згодан начин за одрицање свих подређених текстуалних поља одједном: пролази кроз целу хијерархију приказа и позива resignFirstResponder код тренутног first responder-а.
// Одрицање при притиску Done
@objc func doneButtonTapped() {
textField.resignFirstResponder()
}
// Одрицање при додиру празне области
override func touchesBegan(
_ touches: Set<UITouch>,
with event: UIEvent?
) {
view.endEditing(true)
}
// Одрицање за сва поља обрасца
func validateAndSubmit() {
view.endEditing(true)
// Логика слања обрасца
}
Постоје ситуације када resignFirstResponder може вратити false. Ово се дешава ако је објект преиначио метод и експлицитно забранио уклањање статуса. На пример, текстуално поље у процесу валидације може привремено блокирати одрицање да би спречило губитак података. У таквим случајевима потребно је сачекати завршетак валидације и тек онда принудно одрицање.
UIResponder пружа својство isFirstResponder (само за читање), које враћа true ако је дати објект тренутно first responder. Ово је корисно за условну логику — на пример, да се не извршава акција ако је текстуално поље у фокусу и корисник уноси податке.
iOS не пружа уграђени API за добијање тренутног first responder-а на нивоу целе апликације. Програмери стварају ову могућност кроз обилазак хијерархије приказа помоћу UIResponder метода. Apple решење препоручује слабу референцу на first responder, која се може ажурирати путем KVO или делегата.
// Проширење за проналажење first responder-а
extension UIView {
var firstResponder: UIResponder? {
guard isFirstResponder else {
return subviews.compactMap { $0.firstResponder }.first
}
return self
}
}
// Употреба
if let current = view.firstResponder {
print("Current first responder: \(current)")
}
За праћење промена first responder-а можете се претплатити на обавештења UIResponder.keyboardWillShowNotification и UIResponder.keyboardWillHideNotification — она индиректно указују да је неки текстуални објект постао или престао бити first responder. Међутим, директна претплата на промену isFirstResponder не постоји; за то се користи KVO или прилагођени делегати.
Прилагођени прикази могу постати first responder ако преиначе canBecomeFirstResponder и врате true. Ово је неопходно за компоненте које треба да примају догађаје тастатуре или физичких дугмади — на пример, прилагођени контролери игара или уређивачи кода засновани на UITextView.
При креирању прилагођеног first responder-а важно је запамтити доступност: VoiceOver и Switch Control се ослањају на правилно постављање first responder-а за навигацију. Ако прилагођени приказ постане first responder, он мора правилно имплементирати протокол UIAccessibility и обавештавати асистивне технологије о свом статусу.
За прилагођени унос (на пример, скенер бар кодова или дигитална тастатура) преиначите својство inputView — вратите прилагођени UIView који ће се приказивати уместо стандардне тастатуре када је овај приказ first responder. Слично, inputAccessoryView додаје панел изнад тастатуре.
Често постављана питања
First Responder — је објект UIResponder који тренутно прима догађаје уноса (додири, тастери, акцелерометар). Поставља се путем becomeFirstResponder, мора враћати true из canBecomeFirstResponder. Само један објект може бити first responder у апликацији.
Позовите textField.becomeFirstResponder() програмски, на пример, у viewDidAppear. Уверите се да textField није скривен, userInteractionEnabled = true и isEnabled = true. Ако се поље налази у UITableView или UICollectionView, уверите се да је ћелија видљива на екрану.
Додајте UITapGestureRecognizer на главни приказ и у његовом руковаоцу позовите view.endEditing(true). Ово ће аутоматски пронаћи тренутни first responder и позвати resignFirstResponder. Алтернативно, преиначите touchesBegan у UIViewController-у са позивом endEditing.
becomeFirstResponder враћа false ако canBecomeFirstResponder враћа false, приказ је скривен, није у хијерархији прозора или userInteractionEnabled = false. Такође проверите да је приказ додат у прозор — приказ који није на екрану неће радити са becomeFirstResponder.
iOS не пружа глобални API за ово. Користите рекурзивни обилазак хијерархије приказа кроз проширење UIView које проверава isFirstResponder код сваког subview-а. Алтернатива — чувајте слабу референцу на последњи first responder у AppDelegate-у и ажурирајте је кроз UITextField делегате.
Закључак
Развићемо мобилну апликацију под кључ
IT Sectr креира iOS и Android апликације за стартапе и предузећа од 2017. године. Саветоваћемо вас и предложити најбоље решење.
Прочитајте такође