First Responder — iOS-da UIResponder obyektidir, ilk olaraq toxunma hadisələrini, düymə basmalarını, silkələmə jestlərini və menyu əmrlərini qəbul edir. Hər an tətbiqdə yalnız bir obyekt first responder ola bilər. Təyinat avtomatik (UITextField fokusunda) və ya proqram olaraq becomeFirstResponder metodu vasitəsilə baş verir. Apple Developer Documentation (2026)-ya görə, obyekt yalnız canBecomeFirstResponder metodu true qaytararsa first responder ola bilər, bu da mexanizmi açıq və idarəolunan edir.
Əsas məqamlar
First Responder — iOS tətbiqində hazırda giriş hadisələrini qəbul edən UIResponder obyektidir. Sistem bütün toxunma hadisələrini, düymə basmalarını, hərəkət hadisələrini (cihazı silkələmə) və aksiya mesajlarını (məsələn, kontekst menyusunun çağırılması) məhz bu obyektə yönləndirir.
First responder konsepsiyası Responder Chain-in ilk halqasıdır. Əgər first responder alınan hadisəni emal etmirsə, o avtomatik olaraq zəncirdəki növbəti obyektə ötürülür. Bu, hadisənin itirilməyəcəyinə, ardıcıl olaraq iyerarxiyadakı bütün potensial emalçılara təklif ediləcəyinə zəmanət verir.
Apple-a görə, first responder statusu UIResponder və onun canBecomeFirstResponder və becomeFirstResponder metodları ilə sıx bağlıdır. Varsayılan olaraq UIView yalnız müəyyən alt siniflər üçün true qaytarır — UITextField, UITextView, UISearchBar. Digər view-lər, o cümlədən adi UIView, false qaytarır, bu da təsadüfi təyinatın qarşısını alır.
Təyinat first responder iki yolla baş verə bilər: avtomatik, istifadəçi UITextField-ə toxunduqda (sistem daxili olaraq becomeFirstResponder-i çağırır) və ya proqram olaraq, developer hər hansı UIResponder obyektində becomeFirstResponder metodunu açıq şəkildə çağırdıqda.
Təyinatdan əvvəl iOS canBecomeFirstResponder-i yoxlayır. Metod false qaytarırsa, becomeFirstResponder çağırışı nəzərə alınmır və obyekt first responder olmur. Bu, hadisələri emal etməyə hazır olmayan obyektlərin — məsələn, gizli və ya söndürülmüş interfeys elementlərinin təyin edilməsinin qarşısını alan qoruyucu mexanizmdir.
class CustomTextField: UITextField {
override var canBecomeFirstResponder: Bool {
return super.canBecomeFirstResponder
}
}
// Proqram təyinatı
textField.becomeFirstResponder()
// First responder olub-olmadığını yoxla
if textField.isFirstResponder {
print("TextField indi first responder-dir")
}
Yeni first responder təyin edilərkən iOS avtomatik olaraq əvvəlki obyektdə resignFirstResponder-i çağırır. Bu, sistemdə həmişə yalnız bir obyektin first responder statusuna malik olmasına zəmanət verir. Yeni obyekt first responder ola bilmirsə (canBecomeFirstResponder = false), köhnə öz statusunu saxlayır.
iOS klaviaturası məhz first responder mexanizmi sayəsində ekranda görünür. UITextField və ya UITextView first responder olduqda, sistem avtomatik olaraq bu sahənin cari keyboardType-nə uyğun klaviaturanı göstərir. First responder imtina etdikdə klaviatura gizlənir.
Bu davranış iOS-da əsas UX mexanizmidir: istifadəçi giriş sahəsinə toxunur — klaviatura görünür; Return düyməsini basır və ya başqa sahəyə toxunur — klaviatura dəyişir və ya gizlənir. Developer UIResponder metodları, həmçinin inputView və inputAccessoryView vasitəsilə standart klaviaturanı xüsusi ilə əvəz edərək bunu idarə edə bilər.
Input Accessory View — klaviatura üzərində əlavə paneldir, o da first responder-ə bağlıdır. Məsələn, giriş sahələri arasında naviqasiya üçün Next, Previous, Done düymələri olan panel. Klaviatura ilə birlikdə göstərilir və gizlənir, first responder statusu ilə sinxronlaşır.
| Hadisə | First responder statusu | Klaviatura |
|---|---|---|
| UITextField-ə toxunma | First responder olur | Görünür |
| Return basılması | Qalır və ya imtina edir | Qalır və ya gizlənir |
| Başqa sahəyə toxunma | Yeni sahəyə keçir | Dəyişir |
| resignFirstResponder çağırışı | Ləğv olunur | Gizlənir |
| Tətbiqin gizlədilməsi | Avtomatik imtina | Gizlənir |
ResignFirstResponder — UIResponder metodudur, obyektdən first responder statusunu ləğv edir. Çağırışdan sonra obyekt giriş hadisələrini qəbul etməyi dayandırır, klaviatura (aktiv idisə) gizlənir. Metod Bool qaytarır — imtina uğurlu olarsa true.
Developer-lər tez-tez resignFirstResponder-i Done düyməsinin basılmasına cavab olaraq, ekranın boş sahəsinə toxunma (view.endEditing) və ya ekrandan çıxarkən çağırırlar. view.endEditing(true) — bütün uşaq mətn sahələri üçün bir dəfəyə imtina etməyin rahat üsuludur: bütün view iyerarxiyasını gəzir və cari first responder-də resignFirstResponder çağırır.
// Done düyməsinə basıldıqda imtina
@objc func doneButtonTapped() {
textField.resignFirstResponder()
}
// Boş sahəyə toxunulduqda imtina
override func touchesBegan(
_ touches: Set<UITouch>,
with event: UIEvent?
) {
view.endEditing(true)
}
// Bütün forma sahələri üçün imtina
func validateAndSubmit() {
view.endEditing(true)
// Forma göndərmə məntiqi
}
Bəzi hallarda resignFirstResponder false qaytara bilər. Bu, obyekt metodu ləğv edibsə və statusun ləğvini açıq şəkildə qadağan edibsə baş verir. Məsələn, validasiya prosesində olan mətn sahəsi məlumat itkisinin qarşısını almaq üçün müvəqqəti olaraq imtinanı bloklaya bilər. Belə hallarda validasiyanın bitməsini gözləmək və yalnız sonra məcburi imtina etmək lazımdır.
UIResponder isFirstResponder xassəsini (yalnız oxumaq üçün) təqdim edir, bu da verilən obyektin hazırda first responder olub-olmadığını göstərir. Bu, şərti məntiq üçün faydalıdır — məsələn, mətn sahəsi fokusdadırsa və istifadəçi məlumat daxil edirsə, hərəkəti yerinə yetirməmək üçün.
iOS bütün tətbiq miqyasında cari first responder-i əldə etmək üçün daxili API təmin etmir. Developer-lər bu imkanı UIResponder metodu ilə view iyerarxiyasını gəzərək yaradırlar. Apple həlli first responder-ə zəif istinadı tövsiyə edir, onu KVO və ya delegate-lər vasitəsilə yeniləmək olar.
// First responder tapmaq üçün genişləndirmə
extension UIView {
var firstResponder: UIResponder? {
guard isFirstResponder else {
return subviews.compactMap { $0.firstResponder }.first
}
return self
}
}
// İstifadə
if let current = view.firstResponder {
print("Current first responder: \(current)")
}
First responder dəyişikliklərini izləmək üçün UIResponder.keyboardWillShowNotification və UIResponder.keyboardWillHideNotification bildirişlərinə abunə olmaq olar — onlar dolayı yolla hansısa mətn obyektinin first responder olduğunu və ya olmadığını göstərir. Lakin isFirstResponder dəyişikliyinə birbaşa abunəlik mövcud deyil; bunun üçün KVO və ya xüsusi delegate-lər istifadə olunur.
Xüsusi view-lər canBecomeFirstResponder-i ləğv edib true qaytararaq first responder ola bilərlər. Bu, klaviatura və ya fiziki düymə hadisələrini qəbul etməli olan komponentlər üçün zəruridir — məsələn, xüsusi oyun kontrollerləri və ya UITextView əsaslı kod redaktorları.
Xüsusi first responder yaradarkən əlçatanlığı xatırlamaq vacibdir: VoiceOver və Switch Control naviqasiya üçün first responder-in düzgün təyinatına güvənir. Xüsusi view first responder olarsa, o, UIAccessibility protokolunu düzgün tətbiq etməli və köməkçi texnologiyalara öz statusu barədə məlumat verməlidir.
Xüsusi giriş üçün (məsələn, barkod skaneri və ya rəqəm klaviaturası) inputView xassəsini ləğv edin — bu view first responder olduqda standart klaviatura əvəzinə göstəriləcək xüsusi UIView qaytarın. Eynilə, inputAccessoryView klaviatura üzərində panel əlavə edir.
Tez-tez verilən suallar
First Responder — hazırda giriş hadisələrini (toxunma, düymələr, akselerometr) qəbul edən UIResponder obyektidir. becomeFirstResponder vasitəsilə təyin olunur, canBecomeFirstResponder-dən true qaytarmalıdır. Tətbiqdə yalnız bir obyekt first responder ola bilər.
textField.becomeFirstResponder()-i proqram olaraq çağırın, məsələn, viewDidAppear-da. textField-in gizli olmadığına, userInteractionEnabled = true və isEnabled = true olduğuna əmin olun. Sahə UITableView və ya UICollectionView-dədirsə, hüceyrənin ekranda göründüyünü yoxlayın.
Əsas view-ə UITapGestureRecognizer əlavə edin və onun işləyicisində view.endEditing(true) çağırın. Bu avtomatik olaraq cari first responder-i tapacaq və resignFirstResponder çağıracaq. Alternativ olaraq UIViewController-də touchesBegan-i endEditing çağırışı ilə ləğv edin.
becomeFirstResponder false qaytarır, əgər canBecomeFirstResponder false qaytarırsa, view gizlidir, pəncərə iyerarxiyasında deyil və ya userInteractionEnabled = false. Həmçinin view-in pəncərəyə əlavə edildiyini yoxlayın — ekranda olmayan view-də becomeFirstResponder işləməyəcək.
iOS bunun üçün qlobal API təmin etmir. Hər subview-də isFirstResponder-i yoxlayan UIView genişləndirməsi vasitəsilə view iyerarxiyasının rekursiv gəzilməsindən istifadə edin. Alternativ — AppDelegate-də son first responder-ə zəif istinad saxlayın və onu UITextField delegate-ləri vasitəsilə yeniləyin.
Nəticə
Açar təslim mobil tətbiq hazırlayacağıq
IT Sectr 2017-ci ildən startaplar və bizneslər üçün iOS və Android tətbiqləri yaradır. Sizə məsləhət verəcəyik və ən yaxşı həlli təklif edəcəyik.
Həm də oxuyun