First Responder — یک شیء UIResponder در iOS است که اولین بار رویدادهای لمس، فشار کلیدها، حرکات تکان و دستورات منو را دریافت میکند. در هر لحظه فقط یک شیء در برنامه میتواند first responder باشد. تعیین به صورت خودکار (در focus 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. سایر viewها، از جمله 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) — یک راه راحت برای انصراف همه فیلدهای متنی فرزند به طور همزمان است: کل سلسلهمراتب view را پیمایش میکند و 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 باشد. این برای منطق شرطی مفید است — به عنوان مثال، برای انجام ندادن یک عمل اگر فیلد متنی در focus است و کاربر داده وارد میکند.
iOS API داخلی برای دریافت first responder جاری در مقیاس کل برنامه ارائه نمیدهد. توسعهدهندگان این قابلیت را از طریق پیمایش سلسلهمراتب view با استفاده از متد UIResponder ایجاد میکنند. راهحل Apple یک مرجع ضعیف به first responder را توصیه میکند که میتوان از طریق KVO یا delegateها بهروزرسانی کرد.
// افزونه برای یافتن 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 یا delegateهای سفارشی استفاده میشود.
viewهای سفارشی میتوانند first responder شوند اگر canBecomeFirstResponder را بازنویسی کرده و true برگردانند. این برای کامپوننتهایی که باید رویدادهای صفحه کلید یا دکمههای فیزیکی را دریافت کنند ضروری است — مانند کنترلکنندههای بازی سفارشی یا ویرایشگرهای کد مبتنی بر UITextView.
هنگام ایجاد first responder سفارشی مهم است که دسترسیپذیری را در نظر داشته باشید: VoiceOver و Switch Control برای پیمایش به تعیین صحیح first responder متکی هستند. اگر یک view سفارشی first responder شود، باید پروتکل UIAccessibility را به درستی پیادهسازی کند و وضعیت خود را به فناوریهای کمکی اطلاع دهد.
برای ورودی سفارشی (مانند اسکنر بارکد یا صفحه کلید عددی) ویژگی inputView را بازنویسی کنید — یک UIView سفارشی برگردانید که به جای صفحه کلید استاندارد نمایش داده میشود وقتی این view first responder است. به طور مشابه، inputAccessoryView یک پنل بالای صفحه کلید اضافه میکند.
سوالات متداول
First Responder — یک شیء UIResponder است که در حال حاضر رویدادهای ورودی (لمس، کلیدها، شتابسنج) را دریافت میکند. از طریق becomeFirstResponder تعیین میشود، باید true از canBecomeFirstResponder برگرداند. فقط یک شیء میتواند first responder در برنامه باشد.
textField.becomeFirstResponder() را برنامهنویسی فراخوانی کنید، مثلاً در viewDidAppear. مطمئن شوید textField مخفی نیست، userInteractionEnabled = true و isEnabled = true است. اگر فیلد در UITableView یا UICollectionView است، مطمئن شوید سلول روی صفحه قابل مشاهده است.
UITapGestureRecognizer را به view اصلی اضافه کنید و در handler آن view.endEditing(true) را فراخوانی کنید. این به طور خودکار first responder فعلی را پیدا کرده و resignFirstResponder را فراخوانی میکند. جایگزین: touchesBegan را در UIViewController با فراخوانی endEditing بازنویسی کنید.
becomeFirstResponder false برمیگرداند اگر canBecomeFirstResponder false برگرداند، view مخفی باشد، در سلسلهمراتب پنجره نباشد یا userInteractionEnabled = false باشد. همچنین بررسی کنید که view به پنجره اضافه شده باشد — viewای که روی صفحه نیست becomeFirstResponder کار نخواهد کرد.
iOS API سراسری برای این کار ارائه نمیدهد. از پیمایش بازگشتی سلسلهمراتب view از طریق extension UIView که isFirstResponder را در هر subview بررسی میکند استفاده کنید. جایگزین — یک مرجع ضعیف به آخرین first responder در AppDelegate ذخیره کرده و آن را از طریق delegateهای UITextField بهروزرسانی کنید.
خلاصه
ما یک اپلیکیشن موبایل به صورت کلید در دست توسعه خواهیم داد
IT Sectr از سال 2017 برنامههای iOS و Android را برای استارتاپها و کسبوکارها ایجاد میکند. ما به شما مشاوره میدهیم و بهترین راهحل را پیشنهاد خواهیم کرد.
همچنین بخوانید