First Responder, iOS'ta dokunma olaylarını, tuş basımlarını, sallama hareketlerini ve menü komutlarını ilk alan UIResponder nesnesidir. Herhangi bir anda, uygulamada yalnızca bir nesne first responder olabilir. Atama, otomatik olarak (bir UITextField odak aldığında) veya programatik olarak becomeFirstResponder metodu aracılığıyla gerçekleşir. Apple Developer Documentation (2026)'ya göre, bir nesne yalnızca canBecomeFirstResponder metodu true döndürürse first responder olabilir, bu da bu mekanizmayı açık ve kontrol edilebilir hale getirir.
Önemli Noktalar
First Responder, bir iOS uygulamasında şu anda girdi olaylarını alan UIResponder nesnesidir. Sistem tüm dokunma olaylarını, tuş basımlarını, hareket olaylarını (cihazı sallama) ve eylem mesajlarını (örneğin, bir bağlam menüsünü çağırma) bu nesneye yönlendirir.
First responder kavramı, Responder Chain'in ilk halkasıdır. First responder alınan bir olayı işlemezse, olay otomatik olarak zincirdeki bir sonraki nesneye iletilir. Bu, bir olayın kaybolmamasını, hiyerarşideki tüm potansiyel işleyicilere sırayla sunulmasını sağlar.
Apple'a göre, first responder durumu UIResponder ve onun canBecomeFirstResponder ile becomeFirstResponder metotlarıyla yakından ilişkilidir. Varsayılan olarak, UIView yalnızca belirli alt sınıflar için true döndürür — UITextField, UITextView, UISearchBar. Basit UIView dahil diğer görünümler false döndürerek yanlışlıkla atamayı önler.
Atama iki şekilde gerçekleşebilir: otomatik olarak, kullanıcı bir UITextField'a dokunduğunda (sistem dahili olarak becomeFirstResponder'ı çağırır) veya programatik olarak, geliştirici herhangi bir UIResponder nesnesinde becomeFirstResponder metodu açıkça çağırdığında.
Atamadan önce, iOS canBecomeFirstResponder'ı kontrol eder. Metot false döndürürse, becomeFirstResponder çağrısı görmezden gelinir ve nesne first responder olmaz. Bu, olayları işlemeye hazır olmayan nesnelerin (örneğin, gizli veya devre dışı bırakılmış arayüz öğeleri) atanmasını önleyen koruyucu bir mekanizmadır.
class CustomTextField: UITextField {
override var canBecomeFirstResponder: Bool {
return super.canBecomeFirstResponder
}
}
// Programatik atama
textField.becomeFirstResponder()
// First responder olup olmadığını kontrol et
if textField.isFirstResponder {
print("TextField artık first responder")
}
Yeni bir first responder atandığında, iOS otomatik olarak önceki nesnede resignFirstResponder'ı çağırır. Bu, sistemde her zaman yalnızca bir nesnenin first responder durumunda olmasını garanti eder. Yeni nesne first responder olamazsa (canBecomeFirstResponder = false), eski nesne durumunu korur.
iOS klavyesi, first responder mekanizması sayesinde ekranda görünür. Bir UITextField veya UITextView first responder olduğunda, sistem otomatik olarak o alanın mevcut keyboardType'ıyla ilişkili klavyeyi görüntüler. First responder resign yaptığında klavye gizlenir.
Bu davranış, iOS'ta önemli bir UX mekanizmasıdır: kullanıcı bir giriş alanına dokunur — klavye görünür; Geri Dön tuşuna basar veya başka bir alana dokunur — klavye değişir veya gizlenir. Geliştirici, UIResponder metotlarının yanı sıra inputView ve inputAccessoryView aracılığıyla standart klavyeyi özel bir klavyeyle değiştirerek bunu kontrol edebilir.
Input Accessory View, klavyenin üzerinde first responder'a da bağlı olan ek bir paneldir. Örneğin, giriş alanları arasında gezinmek için Sonraki, Önceki, Bitti düğmelerine sahip bir panel. Klavyeyle birlikte görünür ve kaybolur, first responder durumuyla senkronize olur.
| Olay | First Responder Durumu | Klavye |
|---|---|---|
| UITextField'a dokunma | First responder olur | Görünür |
| Return tuşuna basma | Kalır veya resign yapar | Kalır veya gizlenir |
| Başka alana dokunma | Yeni alana geçer | Değişir |
| resignFirstResponder çağırma | Kaldırılır | Gizlenir |
| Uygulama gizlenir | Otomatik resign yapar | Gizlenir |
ResignFirstResponder, bir nesneden first responder durumunu kaldıran UIResponder metodudur. Çağrıdan sonra, nesne girdi olaylarını almayı durdurur ve klavye (aktifse) gizlenir. Metot bir Bool döndürür — resign başarılıysa true.
Geliştiriciler genellikle Bitti düğmesine basılması, ekranın boş bir alanına dokunulması (view.endEditing) veya ekrandan çıkılması yanıtında resignFirstResponder'ı çağırır. view.endEditing(true), tüm alt metin alanları için aynı anda resign yapmanın kullanışlı bir yoludur: görünüm hiyerarşisinin tamamını dolaşır ve mevcut first responder'da resignFirstResponder'ı çağırır.
// Bitti düğmesine basınca resign
@objc func doneButtonTapped() {
textField.resignFirstResponder()
}
// Boş alana dokununca resign
override func touchesBegan(
_ touches: Set<UITouch>,
with event: UIEvent?
) {
view.endEditing(true)
}
// Tüm form alanları için resign
func validateAndSubmit() {
view.endEditing(true)
// Form gönderme mantığı
}
resignFirstResponder'ın false döndürdüğü durumlar vardır. Bu, nesne metodu geçersiz kıldıysa ve durumun kaldırılmasını açıkça engellediyse olur. Örneğin, doğrulama sürecindeki bir metin alanı, veri kaybını önlemek için resign'i geçici olarak engelleyebilir. Bu gibi durumlarda, doğrulamanın tamamlanmasını bekleyin ve ardından zorla resign yapın.
UIResponder, isFirstResponder özelliğini (salt okunur) sağlar; bu özellik, belirtilen nesne şu anda first responder ise true döndürür. Bu, koşullu mantık için kullanışlıdır — örneğin, bir metin alanı odaklanmışsa ve kullanıcı veri giriyorsa bir eylemi gerçekleştirmekten kaçınmak için.
iOS, uygulama çapında geçerli first responder'ı almak için yerleşik bir API sağlamaz. Geliştiriciler, UIResponder metodunu kullanarak görünüm hiyerarşisini dolaşarak bunu başarır. Apple, KVO veya delegeler aracılığıyla güncellenebilen first responder'a zayıf bir referans (weak reference) önerir.
// First responder bulma uzantısı
extension UIView {
var firstResponder: UIResponder? {
guard isFirstResponder else {
return subviews.compactMap { $0.firstResponder }.first
}
return self
}
}
// Kullanım
if let current = view.firstResponder {
print("Current first responder: \(current)")
}
Değişiklikleri izlemek için UIResponder.keyboardWillShowNotification ve UIResponder.keyboardWillHideNotification'a abone olabilirsiniz — bunlar, bir metin nesnesinin first responder olduğunu veya olmaktan çıktığını dolaylı olarak belirtir. Ancak, isFirstResponder değişiklikleri için doğrudan bir abonelik yoktur; bunun yerine KVO veya özel delegeler kullanılır.
Özel görünümler, canBecomeFirstResponder'ı geçersiz kılarak ve true döndürerek first responder olabilir. Bu, klavye veya fiziksel düğme olaylarını alması gereken bileşenler için gereklidir — örneğin, özel oyun kumandaları veya UITextView tabanlı kod düzenleyicileri.
Özel bir first responder oluştururken erişilebilirliği göz önünde bulundurmak önemlidir: VoiceOver ve Switch Control, gezinme için doğru first responder atamasına güvenir. Özel bir görünüm first responder olursa, UIAccessibility protokolünü doğru şekilde uygulamalı ve yardımcı teknolojilere durumunu bildirmelidir.
Özel girdi için (örneğin, bir barkod tarayıcı veya dijital tuş takımı), inputView özelliğini geçersiz kılın — bu görünüm first responder olduğunda standart klavye yerine görüntülenecek özel bir UIView döndürün. Benzer şekilde, inputAccessoryView klavyenin üzerine bir panel ekler.
Sıkça Sorulan Sorular
First Responder, şu anda girdi olaylarını (dokunma, tuşlar, ivmeölçer) alan UIResponder nesnesidir. becomeFirstResponder aracılığıyla atanır ve canBecomeFirstResponder'dan true döndürmelidir. Bir uygulamada yalnızca bir nesne first responder olabilir.
textField.becomeFirstResponder() öğesini programatik olarak çağırın, örneğin viewDidAppear içinde. textField'ın gizli olmadığından, userInteractionEnabled = true ve isEnabled = true olduğundan emin olun. Alan bir UITableView veya UICollectionView içindeyse, hücrenin ekranda görünür olduğundan emin olun.
Ana görünüme bir UITapGestureRecognizer ekleyin ve işleyicisinde view.endEditing(true) çağırın. Bu, geçerli first responder'ı otomatik olarak bulur ve resignFirstResponder'ı çağırır. Alternatif olarak, UIViewController'da touchesBegan'ı endEditing çağrısıyla geçersiz kılın.
becomeFirstResponder, canBecomeFirstResponder false döndürürse, görünüm gizliyse, pencere hiyerarşisinde değilse veya userInteractionEnabled = false ise false döndürür. Ayrıca görünümün pencereye eklendiğini kontrol edin — ekranda olmayan bir görünüm becomeFirstResponder'a yanıt vermez.
iOS bunun için küresel bir API sağlamaz. Her alt görünümde isFirstResponder'ı kontrol eden bir UIView uzantısı aracılığıyla görünüm hiyerarşisinin yinelemeli olarak taranmasını kullanın. Bir alternatif, AppDelegate'de son first responder'a zayıf bir referans depolamak ve UITextField delegeleri aracılığıyla güncellemektir.
Özet
Anahtar teslim bir mobil uygulama geliştireceğiz
IT Sectr, 2017'den beri girişimler ve işletmeler için iOS ve Android uygulamaları oluşturmaktadır. Size danışmanlık yapacak ve en iyi çözümü önereceğiz.
Ayrıca okuyun