First Responder — iOS'dagi UIResponder obyekti bo'lib, birinchi bo'lib teginish hodisalarini, tugma bosishlarini, silkish imo-ishoralarini va menyu buyruqlarini qabul qiladi. Har bir daqiqada ilovada faqat bitta obyekt first responder bo'lishi mumkin. Tayinlash avtomatik (UITextField fokusida) yoki dasturiy ravishda becomeFirstResponder metodi orqali amalga oshiriladi. Apple Developer Documentation (2026) ma'lumotlariga ko'ra, obyekt faqat canBecomeFirstResponder metodi true qaytarsagina first responder bo'lishi mumkin, bu mexanizmni aniq va boshqariladigan qiladi.
Asosiy fikrlar
First Responder — iOS ilovasida hozirda kiritish hodisalarini qabul qiluvchi UIResponder obyektidir. Tizim barcha teginish hodisalarini, tugma bosishlarini, harakat hodisalarini (qurilmani silkitish) va aksiya xabarlarini (masalan, kontekst menyusini chaqirish) aynan shu obyektga yo'naltiradi.
First responder tushunchasi Responder Chain ning birinchi bo'g'inidir. Agar first responder qabul qilingan hodisani qayta ishlamasa, u avtomatik ravishda zanjirdagi keyingi obyektga uzatiladi. Bu hodisaning yo'qolmasligini, balki ierarxiyadagi barcha potentsial ishlovchilarga ketma-ket taklif qilinishini kafolatlaydi.
Apple'ga ko'ra, first responder statusi UIResponder va uning canBecomeFirstResponder va becomeFirstResponder metodlari bilan chambarchas bog'liq. Odatiy bo'yicha UIView faqat ma'lum kichik sinflar uchun true qaytaradi — UITextField, UITextView, UISearchBar. Boshqa ko'rinishlar, jumladan oddiy UIView, false qaytaradi, bu tasodifiy tayinlashning oldini oladi.
Tayinlash first responder ikki xil usulda amalga oshirilishi mumkin: avtomatik, foydalanuvchi UITextField'ga tekkanda (tizim ichki becomeFirstResponder'ni chaqiradi) yoki dasturiy, dasturchi har qanday UIResponder obyektida becomeFirstResponder metodini aniq chaqirganda.
Tayinlashdan oldin iOS canBecomeFirstResponder ni tekshiradi. Agar metod false qaytarsa, becomeFirstResponder chaqiruvi e'tiborga olinmaydi va obyekt first responder bo'lmaydi. Bu hodisalarni qayta ishlashga tayyor bo'lmagan obyektlarning — masalan, yashirin yoki o'chirilgan interfeys elementlarining tayinlanishining oldini oluvchi himoya mexanizmidir.
class CustomTextField: UITextField {
override var canBecomeFirstResponder: Bool {
return super.canBecomeFirstResponder
}
}
// Dasturiy tayinlash
textField.becomeFirstResponder()
// First responder ekanligini tekshirish
if textField.isFirstResponder {
print("TextField endi first responder")
}
Yangi first responder tayinlanganda iOS avtomatik ravishda avvalgi obyektda resignFirstResponder ni chaqiradi. Bu tizimda har doim faqat bitta obyektning first responder statusiga ega bo'lishini kafolatlaydi. Agar yangi obyekt first responder bo'la olmasa (canBecomeFirstResponder = false), eski o'z statusini saqlab qoladi.
iOS klaviaturasi aynan first responder mexanizmi tufayli ekranda paydo bo'ladi. UITextField yoki UITextView first responder bo'lganda, tizim avtomatik ravishda ushbu maydonning joriy keyboardType'iga mos klaviaturani ko'rsatadi. First responder voz kechganda klaviatura yashirinadi.
Bu xatti-harakat iOS'da asosiy UX mexanizmi hisoblanadi: foydalanuvchi kiritish maydoniga tegadi — klaviatura paydo bo'ladi; Return tugmasini bosadi yoki boshqa maydonga tegadi — klaviatura o'zgaradi yoki yashirinadi. Dasturchi buni UIResponder metodlari, shuningdek inputView va inputAccessoryView orqali standart klaviaturani maxsus bilan almashtirib boshqarishi mumkin.
Input Accessory View — klaviatura ustidagi qo'shimcha panel bo'lib, u ham first responder'ga bog'langan. Masalan, kiritish maydonlari o'rtasida navigatsiya uchun Next, Previous, Done tugmalari bo'lgan panel. Klaviatura bilan birga ko'rsatiladi va yashirinadi, first responder statusi bilan sinxronlanadi.
| Hodisa | First responder statusi | Klaviatura |
|---|---|---|
| UITextField'ga tegish | First responder bo'ladi | Paydo bo'ladi |
| Return bosilishi | Qoladi yoki voz kechadi | Qoladi yoki yashirinadi |
| Boshqa maydonga tegish | Yangi maydonga o'tadi | O'zgaradi |
| resignFirstResponder chaqiruvi | Olib tashlanadi | Yashirinadi |
| Ilovani yashirish | Avtomatik voz kechadi | Yashirinadi |
ResignFirstResponder — UIResponder metodi bo'lib, obyektdan first responder statusini olib tashlaydi. Chaqiruvdan so'ng obyekt kiritish hodisalarini qabul qilishni to'xtatadi va klaviatura (agar faol bo'lsa) yashirinadi. Metod Bool qaytaradi — voz kechish muvaffaqiyatli bo'lsa true.
Dasturchilar ko'pincha resignFirstResponder'ni Done tugmasi bosilganda, ekranning bo'sh joyiga tegilganda (view.endEditing) yoki ekrandan chiqishda chaqiradilar. view.endEditing(true) — barcha bola matn maydonlari uchun bir yo'la voz kechishning qulay usulidir: butun ko'rinish ierarxiyasi bo'ylab o'tadi va joriy first responder'da resignFirstResponder'ni chaqiradi.
// Done tugmasi bosilganda voz kechish
@objc func doneButtonTapped() {
textField.resignFirstResponder()
}
// Bo'sh joyga tegilganda voz kechish
override func touchesBegan(
_ touches: Set<UITouch>,
with event: UIEvent?
) {
view.endEditing(true)
}
// Barcha forma maydonlari uchun voz kechish
func validateAndSubmit() {
view.endEditing(true)
// Forma yuborish mantig'i
}
Ba'zi holatlarda resignFirstResponder false qaytarishi mumkin. Bu obyekt metodni bekor qilgan va statusni olib tashlashni aniq taqiqlagan bo'lsa sodir bo'ladi. Masalan, validatsiya jarayonidagi matn maydoni ma'lumotlar yo'qolishining oldini olish uchun vaqtincha voz kechishni bloklashi mumkin. Bunday hollarda validatsiya tugashini kutish va shundan keyingina majburiy voz kechish kerak.
UIResponder isFirstResponder xususiyatini (faqat o'qish uchun) taqdim etadi, u berilgan obyekt hozirda first responder bo'lsa true qaytaradi. Bu shartli mantiq uchun foydali — masalan, matn maydoni fokusda bo'lsa va foydalanuvchi ma'lumot kiritsa, harakatni bajarmaslik uchun.
iOS butun ilova miqyosida joriy first responder ni olish uchun o'rnatilgan API'ni taqdim etmaydi. Dasturchilar bu imkoniyatni UIResponder metodi yordamida ko'rinish ierarxiyasini aylanib o'tish orqali yaratadilar. Apple yechimi first responder'ga zaif havolani tavsiya qiladi, uni KVO yoki delegatlar orqali yangilash mumkin.
// First responder topish uchun kengaytma
extension UIView {
var firstResponder: UIResponder? {
guard isFirstResponder else {
return subviews.compactMap { $0.firstResponder }.first
}
return self
}
}
// Foydalanish
if let current = view.firstResponder {
print("Current first responder: \(current)")
}
First responder o'zgarishlarini kuzatish uchun UIResponder.keyboardWillShowNotification va UIResponder.keyboardWillHideNotification bildirishnomalariga obuna bo'lish mumkin — ular bilvosita qandaydir matn obyekti first responder bo'lgani yoki bo'lishni to'xtatganini ko'rsatadi. Biroq, isFirstResponder o'zgarishiga to'g'ridan-to'g'ri obuna mavjud emas; buning uchun KVO yoki maxsus delegatlar ishlatiladi.
Maxsus ko'rinishlar canBecomeFirstResponder'ni bekor qilib, true qaytarib, first responder bo'lishi mumkin. Bu klaviatura yoki jismoniy tugma hodisalarini qabul qilishi kerak bo'lgan komponentlar uchun zarur — masalan, maxsus o'yin kontrollerlari yoki UITextView'ga asoslangan kod muharrirlari.
Maxsus first responder yaratishda foydalanish imkoniyatini esda tutish muhim: VoiceOver va Switch Control navigatsiya uchun first responder'ning to'g'ri tayinlanishiga tayanadi. Agar maxsus ko'rinish first responder bo'lsa, u UIAccessibility protokolini to'g'ri amalga oshirishi va yordamchi texnologiyalarga o'z statusi haqida xabar berishi kerak.
Maxsus kiritish uchun (masalan, shtrix-kod skaneri yoki raqamli klaviatura) inputView xususiyatini bekor qiling — ushbu ko'rinish first responder bo'lganda standart klaviatura o'rniga ko'rsatiladigan maxsus UIView'ni qaytaring. Xuddi shunday, inputAccessoryView klaviatura ustiga panel qo'shadi.
Ko'p beriladigan savollar
First Responder — hozirda kiritish hodisalarini (teginish, tugmalar, akselerometr) qabul qiluvchi UIResponder obyektidir. becomeFirstResponder orqali tayinlanadi, canBecomeFirstResponder'dan true qaytarishi kerak. Ilovada faqat bitta obyekt first responder bo'lishi mumkin.
textField.becomeFirstResponder() ni dasturiy chaqiring, masalan, viewDidAppear'da. textField yashirin emasligiga, userInteractionEnabled = true va isEnabled = true ekanligiga ishonch hosil qiling. Agar maydon UITableView yoki UICollectionView'da bo'lsa, hujayraning ekranda ko'rinishini tekshiring.
Asosiy ko'rinishga UITapGestureRecognizer qo'shing va uning ishlovchisida view.endEditing(true) ni chaqiring. Bu avtomatik ravishda joriy first responder'ni topadi va resignFirstResponder'ni chaqiradi. Shu bilan bir qatorda, UIViewController'da touchesBegan'ni endEditing chaqiruvi bilan bekor qiling.
becomeFirstResponder false qaytaradi, agar canBecomeFirstResponder false qaytarsa, ko'rinish yashirin bo'lsa, oyna ierarxiyasida bo'lmasa yoki userInteractionEnabled = false bo'lsa. Shuningdek, ko'rinishning oynaga qo'shilganligini tekshiring — ekranda bo'lmagan ko'rinish becomeFirstResponder bilan ishlamaydi.
iOS buning uchun global API taqdim etmaydi. Har bir subview'da isFirstResponder'ni tekshiruvchi UIView kengaytmasi orqali ko'rinish ierarxiyasini rekursiv aylanib o'tishdan foydalaning. Muqobil — AppDelegate'da oxirgi first responder'ga zaif havolani saqlang va uni UITextField delegatlari orqali yangilang.
Xulosa
Biz kalit topshirig'i bilan mobil ilovani ishlab chiqamiz
IT Sectr 2017-yildan beri startaplar va korxonalar uchun iOS va Android ilovalarini yaratadi. Biz sizga maslahat beramiz va eng yaxshi yechimni taklif qilamiz.