UITextField — este o componentă standard UIKit pentru introducerea textului pe o singură linie în iOS, care moștenește UIControl și acceptă o gamă largă de moduri de tastatură. Conform documentației Apple Developer (2025), UITextField oferă delegatul UITextFieldDelegate cu callback-uri shouldBeginEditing, shouldChangeCharactersInRange și shouldReturn. Spre deosebire de UITextView, UITextField limitează introducerea la o singură linie și acceptă secureTextEntry, leftView și rightView pentru controale personalizate. Acesta este elementul principal pentru formularele de autentificare, căutare, înregistrare și introducere a datelor în aplicațiile iOS.
Principalele
UITextField — este o clasă a framework-ului UIKit destinată introducerii textului pe o singură linie de către utilizator. Clasa moștenește UIControl, ceea ce permite abonarea la evenimente de intrare prin mecanismul target-action: addTarget(self, action: Selector("textChanged:"), for: editingChanged). UITextField afișează marginea (borderStyle), textul placeholder când câmpul este gol, butonul de ștergere (clearButtonMode) și poate conține vizualizări auxiliare stânga/dreapta. Câmpul afișează/ascunde automat tastatura la primirea/pierderea focusului prin becomeFirstResponder și resignFirstResponder. Dimensiunea câmpului este determinată de intrinsicContentSize pe baza font și border style. Pentru a crea UITextField în Interface Builder (Storyboard/XIB) se utilizează Object Library, programatic — prin inițializatorul UITextField(frame: CGRect). Clasa este complet compatibilă cu arhitectura modernă iOS: Combine publishers, @Published în SwiftUI prin UIViewRepresentable și Diffable Data Source pentru formulare.
UITextField acceptă 12 tipuri de tastatură prin proprietatea keyboardType. Fiecare tip optimizează setul de caractere pentru un scenariu specific de introducere. UIKeyboardType.default — tastatura standard QWERTY. UIKeyboardType.numberPad — doar cifre fără caractere suplimentare (ideală pentru coduri PIN și numere de telefon). UIKeyboardType.emailAddress — tastatură cu caracterul @ și punctul pe stratul principal. UIKeyboardType.URL — tastatură cu .com, / și . pe stratul principal. UIKeyboardType.phonePad — tastatură numerică cu +, *, # pentru introducerea numerelor de telefon. UIKeyboardType.decimalPad — cifre cu punct zecimal pentru introducerea prețurilor. UIKeyboardType.webSearch — tastatură cu butonul Go și optimizare pentru interogări de căutare. UIKeyboardType.asciiCapable — doar caractere ASCII pentru alfabetul latin. Tastatura este afișată la apelarea becomeFirstResponder și ascunsă la resignFirstResponder. Tipul tastaturii poate fi schimbat dinamic în timpul editării.
| Tip | Scenariu | Caracteristici |
|---|---|---|
| default | Introducere text generală | QWERTY standard |
| numberPad | PIN, cod | Doar cifre 0-9 |
| emailAddress | @ și . pe stratul principal | |
| URL | Adresă web | .com, /, . pe principal |
| phonePad | Telefon | Cifre, +, *, # |
| decimalPad | Preț, număr | Cifre + punct zecimal |
UITextFieldDelegate — este un protocol care definește comportamentul câmpului text în diferite etape ale intrării. Metodele principale: textFieldShouldBeginEditing(textField) — returnează Bool, permițând sau interzicând începerea editării; textFieldDidBeginEditing — este apelată după apariția tastaturii; textFieldShouldEndEditing — verifică dacă editarea poate fi finalizată (la false câmpul nu pierde focusul); textFieldDidEndEditing — este apelată după ascunderea tastaturii; textFieldShouldChangeCharactersInRange — este apelată la fiecare introducere de caracter, permite filtrarea intrării (doar un caracter permis, dacă returnează false — caracterul nu se adaugă); textFieldShouldReturn — este apelată la apăsarea Return/Go/Next/Search, utilizată pentru trecerea la următorul câmp. Delegatul nu este Optional: toate metodele au implementare implicită, dar pentru comportament personalizat trebuie să suprascrieți metoda corespunzătoare.
Metoda shouldReturn — modelul standard pentru navigarea între câmpurile formularului. Implementare: textFieldShouldReturn(textField) — verificăm care textField a declanșat evenimentul și transferăm focusul la următorul câmp prin becomeFirstResponder(). Dacă acesta este ultimul câmp — apelăm resignFirstResponder() pentru ascunderea tastaturii. Pentru stocarea referințelor la câmpuri utilizați IBOutlet collection sau IBOutlet separate pentru fiecare câmp.
isSecureTextEntry — proprietatea UITextField care la true înlocuiește caracterele introduse cu puncte (•) și blochează copierea textului prin UIMenuController. Utilizată pentru câmpurile de parolă, PIN, CVV. La comutarea între modul securizat și textul obișnuit (show/hide password) setați textField.isSecureTextEntry.toggle(). Important: la schimbarea isSecureTextEntry textul câmpului este resetat — salvați-l în prealabil. LeftView și RightView — sunt UIView-uri personalizate afișate în interiorul câmpului de introducere în stânga sau dreapta. Utilizare tipică: pictograma de căutare în leftView, butonul "Șterge" în rightView. Configurare: textField.leftViewMode = always (întotdeauna) sau whileEditing (doar la editare). Left/right view sunt poziționate automat în interiorul câmpului text ținând cont de padding. Dimensiunea view este determinată de bounds sau Auto Layout.
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
// Buton personalizat pentru afișarea/ascunderea parolei
let showButton = UIButton(type: .system)
showButton.setTitle("Afișează", for: .normal)
showButton.addTarget(self, action: #selector(togglePasswordVisibility),
for: .touchUpInside)
passwordField.rightView = showButton
passwordField.rightViewMode = .always
}
@objc func togglePasswordVisibility() {
passwordField.isSecureTextEntry.toggle()
}
}
UITextInputTraits — este un protocol care definește ajustarea vizuală și comportamentală a tastaturii pentru UITextField. Proprietăți principale: autocorrectionType (.default, .no, .yes) — activează sau dezactivează autocorectarea textului; autocapitalizationType (.none, .words, .sentences, .allCharacters) — Caps Lock automat pentru primul caracter; spellCheckingType — verificare ortografică; returnKeyType (.done, .go, .next, .search, .send, .continue, .join, .route, .emergencyCall) — textul butonului Return pe tastatură; enablesReturnKeyAutomatically — blocarea automată a butonului Return la câmpul gol. Pentru câmpurile de introducere a numelui utilizați autocapitalizationType = .words, pentru email — autocorrectionType = .no, pentru URL — keyboardType = .URL + autocapitalizationType = .none. Configurarea traits se efectuează după inițializarea câmpului înainte de afișarea acestuia. Modificarea traits actualizează dinamic tastatura la următoarea apariție.
Return Key Type determină textul butonului de pe tastatură: Next — trecere la următorul câmp, Done — finalizare introducere, Search — pornire căutare, Send — trimitere formular, Continue — continuare completare. În combinație cu metoda delegatului shouldReturn, returnKeyType permite crearea unui UX natural: utilizatorul completează câmpurile, apăsând Next pentru a trece la următorul și Done pentru a trimite pe ultimul câmp. Pentru personalizarea textului butonului utilizați UIButtonConfiguration în iOS 15+.
Placeholder UITextField — este textul afișat cu gri când câmpul este gol. Configurare: textField.placeholder = "Enter email". Pentru personalizarea culorii și fontului placeholder utilizați attributedPlaceholder cu NSAttributedString. Masca de introducere este implementată prin metoda delegatului shouldChangeCharactersInRange — formatul numărului de telefon, datei, cărții de credit, SNILS este acceptat. Masca de introducere permite separarea afișării de valoare: utilizatorul vede textul formatat (de exemplu, +7 (999) 999-99-99), iar în model se stochează "79999999999". Exemplu de implementare: stocăm masca ca șir de caractere cu simboluri X pentru înlocuire; la fiecare introducere creăm șirul formatat și returnăm false în shouldChangeCharactersInRange, înlocuind textul câmpului prin textField.text = formattedText. Pentru numere utilizați NumberFormatter și decimal keyboardType.
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 {
// Blocarea spațiilor în email
if textField == emailField && string == " " {
return false
}
// Limită lungime parolă
if textField == passwordField {
let newLength = (textField.text?.count ?? 0) +
string.count - range.length
return newLength <= 32
}
return true
}
}
Să analizăm un exemplu complet de implementare a unui formular de autentificare cu UITextField, validare email și feedback vizual. Formularul conține două câmpuri: emailField (tastatură emailAddress, fără autocorectare) și passwordField (secureTextEntry). Validarea se efectuează în shouldChangeCharactersInRange și suplimentar la apăsarea butonului Login. Pentru feedback vizual: margine roșie (layer.borderColor) la eroare, verde — la validare reușită. Resetarea marginii la începerea editării în textFieldDidBeginEditing.
Validarea email se efectuează prin NSPredicate cu formatul "SELF MATCHES %@" și o expresie regulată pentru verificarea de bază a formatului. Verificarea reală a existenței emailului trebuie efectuată pe server. Pentru validare avansată utilizați biblioteca SwiftValidators sau Combine publishers. Exemplu: NSPredicate(format: "SELF MATCHES [c] %@", emailRegex).evaluate(with: email). Marginea câmpului este actualizată prin animation block pentru o tranziție lină.
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
}
}
Întrebări frecvente
Utilizați metoda delegatului shouldChangeCharactersInRange. Calculați noua lungime a textului ca existingText.count + newText.count - range.length și returnați false dacă limita a fost depășită. Alternativ: abonați-vă la evenimentul editingChanged prin addTarget și trunchiați textul prin textField.text = String(text.prefix(maxLength)).
Verificați: isUserInteractionEnabled = true (implicit), delegatul nu returnează false în shouldBeginEditing. Dacă câmpul se află în interiorul UIScrollView — dezactivați delaysContentTouches. Dacă câmpul este într-un controler modal — verificați că nu blochează atingerile. Pentru SwiftUI UIViewRepresentable verificați că câmpul devine corect firstResponder prin DispatchQueue.main.async.
Adăugați UITapGestureRecognizer la self.view sau scrollView cu target-action care apelează view.endEditing(true). Alternativă: textField.resignFirstResponder() pentru ascunderea tastaturii unui anumit câmp. Configurați touchesBegan în UIViewController sau utilizați biblioteca IQKeyboardManager pentru gestionarea automată a tastaturii. Nu uitați să dezactivați cancelsTouchesInView pentru funcționarea corectă a butoanelor.
Culoarea textului: textField.textColor = UIColor.label. Fontul: textField.font = UIFont.systemFont(ofSize: 16, weight: .regular). Culoarea placeholder: textField.attributedPlaceholder = NSAttributedString(string: "Email", attributes: [.foregroundColor: UIColor.secondaryLabel]).
Trei moduri: isEnabled = false (schimbă aspectul), isUserInteractionEnabled = false (păstrează stilul vizual) sau returnați false în textFieldShouldBeginEditing al delegatului. Al treilea mod este preferat — blochează introducerea fără a schimba stilul vizual. Pentru setarea programatică a textului în modul doar citire utilizați delegatul.
Rezumat
Vom dezvolta o aplicație mobilă la cheie
IT Sectr creează aplicații iOS și Android pentru startup-uri și afaceri din 2017. Vă vom consilia și vă vom propune cea mai bună soluție.
Citiți și