UITextField, iOS'ta tek satırlı metin girişi için standart bir UIKit bileşenidir, UIControl'den miras alır ve çok çeşitli klavye modlarını destekler. Apple Developer belgelerine (2025) göre UITextField, shouldBeginEditing, shouldChangeCharactersInRange ve shouldReturn geri çağrılarına sahip UITextFieldDelegate'i sağlar. UITextView'in aksine UITextField, girişi tek bir satırla sınırlar ve özel kontroller için secureTextEntry, leftView ve rightView'i destekler. Bu, iOS uygulamalarında kimlik doğrulama formları, arama, kayıt ve veri girişi için ana öğedir.
Ana Noktalar
UITextField, kullanıcı tarafından tek satırlı metin girişi için tasarlanmış bir UIKit framework sınıfıdır. Sınıf UIControl'den miras alır ve target-action mekanizması aracılığıyla giriş olaylarına abone olmaya izin verir: addTarget(self, action: Selector("textChanged:"), for: editingChanged). UITextField bir kenarlık (borderStyle), alan boşken placeholder metni, bir temizleme düğmesi (clearButtonMode) görüntüler ve sol/sağ yardımcı görünümler içerebilir. Alan, becomeFirstResponder ve resignFirstResponder aracılığıyla odağı kazandığında/kaybettiğinde otomatik olarak klavyeyi gösterir/gizler. Alan boyutu, yazı tipi ve kenarlık stiline bağlı olarak intrinsicContentSize tarafından belirlenir. Interface Builder'da (Storyboard/XIB) UITextField oluşturmak için Object Library'yi kullanın; programatik olarak, başlatıcıyı UITextField(frame: CGRect) kullanın. Sınıf, modern iOS mimarisiyle tamamen uyumludur: Combine publishers, UIViewRepresentable aracılığıyla SwiftUI'de @Published ve formlar için Diffable Data Source.
UITextField, keyboardType özelliği aracılığıyla 12 klavye türünü destekler. Her tür, belirli bir giriş senaryosu için karakter kümesini optimize eder. UIKeyboardType.default — standart QWERTY klavye. UIKeyboardType.numberPad — ek semboller olmadan yalnızca rakamlar (PIN kodları ve telefon numaraları için ideal). UIKeyboardType.emailAddress — ana katmanda @ ve nokta bulunan klavye. UIKeyboardType.URL — ana katmanda .com, / ve nokta bulunan klavye. UIKeyboardType.phonePad — telefon numarası girmek için +, *, # ile sayısal tuş takımı. UIKeyboardType.decimalPad — fiyat girmek için ondalık noktalı rakamlar. UIKeyboardType.webSearch — arama sorguları için optimize edilmiş Go düğmeli klavye. UIKeyboardType.asciiCapable — Latin metni için yalnızca ASCII karakterler. becomeFirstResponder çağrıldığında klavye görünür ve resignFirstResponder çağrıldığında gizlenir. Klavye türü düzenleme sırasında dinamik olarak değiştirilebilir.
| Tür | Senaryo | Özellikler |
|---|---|---|
| default | Genel metin girişi | Standart QWERTY |
| numberPad | PIN, kod | Yalnızca 0-9 rakamları |
| emailAddress | E-posta | Ana katmanda @ ve . |
| URL | Web adresi | Ana katmanda .com, /, . |
| phonePad | Telefon | Rakamlar, +, *, # |
| decimalPad | Fiyat, sayı | Rakamlar + ondalık nokta |
UITextFieldDelegate, girişin farklı aşamalarında metin alanının davranışını tanımlayan bir protokoldür. Ana yöntemler: textFieldShouldBeginEditing(textField) — düzenlemenin başlamasına izin veren veya reddeden bir Bool döndürür; textFieldDidBeginEditing — klavye göründükten sonra çağrılır; textFieldShouldEndEditing — düzenlemenin tamamlanıp tamamlanamayacağını kontrol eder (false ise alan odağı kaybetmez); textFieldDidEndEditing — klavye gizlendikten sonra çağrılır; textFieldShouldChangeCharactersInRange — her karakter girişinde çağrılır, girişi filtrelemeye izin verir (yalnızca bir karaktere izin verilir, false döndürülürse karakter eklenmez); textFieldShouldReturn — Return/Go/Next/Search tuşuna basıldığında çağrılır, sonraki alana geçmek için kullanılır. Delegate İsteğe Bağlı Değildir: tüm yöntemlerin varsayılan bir uygulaması vardır, ancak özel davranış için ilgili yöntemi geçersiz kılmanız gerekir.
shouldReturn yöntemi, form alanları arasında gezinmek için standart desendir. Uygulama: textFieldShouldReturn(textField) — hangi textField'ın olayı tetiklediğini kontrol edin ve becomeFirstResponder() aracılığıyla odağı sonraki alana taşıyın. Son alan ise, klavyeyi gizlemek için resignFirstResponder() çağrısı yapın. Alan referanslarını depolamak için her alan için IBOutlet koleksiyonu veya ayrı IBOutlet'ler kullanın.
isSecureTextEntry — true olduğunda girilen karakterleri noktalarla (•) değiştiren ve UIMenuController aracılığıyla metin kopyalamayı engelleyen bir UITextField özelliğidir. Şifre alanları, PIN kodları, CVV için kullanılır. Güvenli mod ile düz metin (show/hide password) arasında geçiş yaparken, textField.isSecureTextEntry.toggle() ayarlayın. Önemli: isSecureTextEntry değiştirildiğinde alan metni sıfırlanır — önceden kaydedin. LeftView ve RightView, giriş alanının içinde sol veya sağda görüntülenen özel UIView'lerdir. Tipik kullanım: leftView'da arama simgesi, rightView'da "Temizle" düğmesi. Yapılandırma: textField.leftViewMode = always (her zaman) veya whileEditing (yalnızca düzenleme sırasında). left/right görünümler, dolgu dikkate alınarak metin alanı içinde otomatik olarak konumlandırılır. Görünüm boyutu bounds veya Auto Layout aracılığıyla ayarlanır.
import UIKit
class LoginViewController: UIViewController {
let passwordField = UITextField()
override func viewDidLoad() {
super.viewDidLoad()
passwordField.isSecureTextEntry = true
passwordField.placeholder = "Password"
passwordField.keyboardType = .asciiCapable
passwordField.delegate = self
// Özel şifre göster/gizle düğmesi
let showButton = UIButton(type: .system)
showButton.setTitle("Göster", for: .normal)
showButton.addTarget(self, action: #selector(togglePasswordVisibility),
for: .touchUpInside)
passwordField.rightView = showButton
passwordField.rightViewMode = .always
}
@objc func togglePasswordVisibility() {
passwordField.isSecureTextEntry.toggle()
}
}
UITextInputTraits, UITextField için klavyenin görsel ve davranışsal görünümünü tanımlayan bir protokoldür. Ana özellikler: autocorrectionType (.default, .no, .yes) — metin otomatik düzeltmeyi etkinleştirir veya devre dışı bırakır; autocapitalizationType (.none, .words, .sentences, .allCharacters) — ilk karakter için otomatik büyük harf kilidi; spellCheckingType — yazım denetimi; returnKeyType (.done, .go, .next, .search, .send, .continue, .join, .route, .emergencyCall) — klavyedeki Return düğmesi metni; enablesReturnKeyAutomatically — alan boşken Return düğmesinin otomatik olarak devre dışı bırakılması. Ad giriş alanları için autocapitalizationType = .words, e-posta için autocorrectionType = .no, URL için keyboardType = .URL + autocapitalizationType = .none kullanın. Özellikler, alan görüntülenmeden önce başlatıldıktan sonra yapılandırılır. Özelliklerin dinamik olarak değiştirilmesi, bir sonraki görünümde klavyeyi günceller.
Return Key Type, klavyedeki düğme metnini tanımlar: Next — sonraki alana geç, Done — girişi tamamla, Search — aramayı başlat, Send — formu gönder, Continue — doldurmaya devam et. shouldReturn delegate yöntemiyle birleştirildiğinde, returnKeyType doğal bir UX sağlar: kullanıcı alanları doldurur, sonrakine geçmek için Next'e ve son alanda göndermek için Done'a basar. Düğme metni özelleştirmesi için iOS 15+'te UIButtonConfiguration kullanın.
UITextField Placeholder'ı, alan boşken gri renkte görüntülenen metindir. Yapılandırma: textField.placeholder = "Enter email". Placeholder'ın rengini ve yazı tipini özelleştirmek için NSAttributedString ile attributedPlaceholder kullanın. Giriş maskesi, delegate yöntemi shouldChangeCharactersInRange aracılığıyla uygulanır — telefon numarası, tarih, kredi kartı ve SNILS biçimlerini destekler. Giriş maskesi, görüntüleme ile değeri ayırmaya olanak tanır: kullanıcı biçimlendirilmiş metni (örneğin, +7 (999) 999-99-99) görürken, model "79999999999" depolar. Uygulama örneği: maskeyi değiştirme için X karakterleri içeren bir dize olarak saklayın; her girişte, biçimlendirilmiş dizeyi oluşturun ve shouldChangeCharactersInRange'de false döndürün, textField.text = formattedText aracılığıyla alan metnini değiştirin. Sayılar için NumberFormatter ve decimal keyboardType kullanın.
extension LoginViewController: UITextFieldDelegate {
func textFieldShouldReturn(
textField: UITextField
) -> Bool {
if textField == emailField {
passwordField.becomeFirstResponder()
} else if textField == passwordField {
textField.resignFirstResponder()
loginTapped()
}
return true
}
func textField(
textField: UITextField,
shouldChangeCharactersIn range: NSRange,
replacementString string: String
) -> Bool {
// E-postadaki boşlukları engelle
if textField == emailField && string == " " {
return false
}
// Şifre uzunluğu sınırı
if textField == passwordField {
let newLength = (textField.text?.count ?? 0) +
string.count - range.length
return newLength <= 32
}
return true
}
}
UITextField, e-posta doğrulaması ve görsel geri bildirim ile bir giriş formu uygulamasının tam bir örneğine bakalım. Form iki alan içerir: emailField (emailAddress klavye, otomatik düzeltme yok) ve passwordField (secureTextEntry). Doğrulama, shouldChangeCharactersInRange'de ve ek olarak Login düğmesine basıldığında gerçekleştirilir. Görsel geri bildirim için: hata durumunda kırmızı kenarlık (layer.borderColor), başarılı doğrulamada yeşil. textFieldDidBeginEditing'de düzenleme başladığında kenarlığı sıfırlama.
E-posta doğrulaması, "SELF MATCHES %@" biçimindeki NSPredicate ve temel biçim kontrolü için düzenli bir ifade kullanılarak gerçekleştirilir. Gerçek e-posta varlık kontrolü sunucuda yapılmalıdır. Gelişmiş doğrulama için SwiftValidators kitaplığını veya Combine publishers'ı kullanın. Örnek: NSPredicate(format: "SELF MATCHES [c] %@", emailRegex).evaluate(with: email). Alan kenarlığı, yumuşak bir geçiş için animasyon bloğu aracılığıyla güncellenir.
func validateEmail(textField: UITextField) {
guard let text = textField.text, !text.isEmpty else {
textField.layer.borderColor = UIColor.clear.cgColor
return
}
let emailRegex = "[A-Z0-9a-z._%+-]+@[A-Za-z0-9.-]+\\.\\p{L}{2,}"
let predicate = NSPredicate(format: "SELF MATCHES [c] %@", emailRegex)
let isValid = predicate.evaluate(with: text)
UIView.animate(withDuration: 0.2) {
textField.layer.borderColor = isValid
? UIColor.systemGreen.cgColor
: UIColor.systemRed.cgColor
textField.layer.borderWidth = 1.0
textField.layer.cornerRadius = 6.0
}
}
Sıkça Sorulan Sorular
Delegate yöntemi shouldChangeCharactersInRange'i kullanın. Yeni metin uzunluğunu existingText.count + newText.count - range.length olarak hesaplayın ve sınır aşılırsa false döndürün. Alternatif: addTarget aracılığıyla editingChanged olayına abone olun ve textField.text = String(text.prefix(maxLength)) kullanarak metni kısaltın.
Kontrol edin: isUserInteractionEnabled = true (varsayılan), delegate shouldBeginEditing'de false döndürmüyor. Alan bir UIScrollView içindeyse, delaysContentTouches'i devre dışı bırakın. Alan modal bir denetleyicideyse, dokunmaları engellemediğini kontrol edin. SwiftUI UIViewRepresentable için, alanın DispatchQueue.main.async aracılığıyla doğru şekilde firstResponder olduğunu kontrol edin.
self.view veya scrollView üzerinde view.endEditing(true) çağıran bir target-action ile UITapGestureRecognizer ekleyin. Alternatif: belirli bir alanın klavyesini gizlemek için textField.resignFirstResponder(). UIViewController'da touchesBegan'ı uygulayın veya otomatik klavye yönetimi için IQKeyboardManager kitaplığını kullanın. Düğmelerin doğru çalışması için cancelsTouchesInView'i devre dışı bırakmayı unutmayın.
Metin rengi: textField.textColor = UIColor.label. Yazı tipi: textField.font = UIFont.systemFont(ofSize: 16, weight: .regular). Placeholder rengi: textField.attributedPlaceholder = NSAttributedString(string: "Email", attributes: [.foregroundColor: UIColor.secondaryLabel]).
Üç yol: isEnabled = false (görünümü değiştirir), isUserInteractionEnabled = false (görsel stili korur) veya textFieldShouldBeginEditing delegate'inde false döndürün. Üçüncü yöntem tercih edilir — görsel stili değiştirmeden girişi engeller. Salt okunur modda programatik olarak metin ayarlamak için delegate'i kullanın.
Ö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