UITextField — to standardowy komponent UIKit do jednowierszowego wprowadzania tekstu w iOS, dziedziczący po UIControl i obsługujący szeroki zakres trybów klawiatury. Według dokumentacji Apple Developer (2025), UITextField udostępnia delegata UITextFieldDelegate z callbackami shouldBeginEditing, shouldChangeCharactersInRange i shouldReturn. W przeciwieństwie do UITextView, UITextField ogranicza wprowadzanie do jednego wiersza i obsługuje secureTextEntry, leftView i rightView dla niestandardowych kontrolek. Jest to podstawowy element formularzy logowania, wyszukiwania, rejestracji i wprowadzania danych w aplikacjach iOS.
Najważniejsze
UITextField — to klasa frameworku UIKit przeznaczona do wprowadzania jednowierszowego tekstu przez użytkownika. Klasa dziedziczy po UIControl, co pozwala na subskrypcję zdarzeń wprowadzania przez mechanizm target-action: addTarget(self, action: Selector("textChanged:"), for: editingChanged). UITextField wyświetla ramkę (borderStyle), tekst zastępczy (placeholder) przy pustym polu, przycisk czyszczenia (clearButtonMode) i może zawierać lewe/prawe widoki pomocnicze. Pole automatycznie pokazuje/ukrywa klawiaturę przy otrzymaniu/utracie focusu przez becomeFirstResponder i resignFirstResponder. Rozmiar pola jest określany przez intrinsicContentSize na podstawie font i border style. Do utworzenia UITextField w Interface Builder (Storyboard/XIB) używa się Object Library, programowo — przez inicjalizator UITextField(frame: CGRect). Klasa jest w pełni kompatybilna z nowoczesną architekturą iOS: Combine publishers, @Published w SwiftUI przez UIViewRepresentable i Diffable Data Source dla formularzy.
UITextField obsługuje 12 typów klawiatury przez właściwość keyboardType. Każdy typ optymalizuje zestaw znaków dla konkretnego scenariusza wprowadzania. UIKeyboardType.default — standardowa klawiatura QWERTY. UIKeyboardType.numberPad — tylko cyfry bez dodatkowych znaków (idealna dla PIN-ów i numerów telefonów). UIKeyboardType.emailAddress — klawiatura ze znakiem @ i kropką na głównej warstwie. UIKeyboardType.URL — klawiatura z .com, / i . na głównej warstwie. UIKeyboardType.phonePad — klawiatura numeryczna z +, *, # do wprowadzania numerów telefonów. UIKeyboardType.decimalPad — cyfry z kropką dziesiętną do wprowadzania cen. UIKeyboardType.webSearch — klawiatura z przyciskiem Go i optymalizacją pod zapytania wyszukiwarki. UIKeyboardType.asciiCapable — tylko znaki ASCII dla alfabetu łacińskiego. Klawiatura jest wyświetlana przy wywołaniu becomeFirstResponder i ukrywana przy resignFirstResponder. Typ klawiatury można zmieniać dynamicznie podczas edycji.
| Typ | Scenariusz | Cechy |
|---|---|---|
| default | Ogólne wprowadzanie tekstu | Standardowa QWERTY |
| numberPad | PIN, kod | Tylko cyfry 0-9 |
| emailAddress | @ i . na głównej warstwie | |
| URL | Adres internetowy | .com, /, . na głównej |
| phonePad | Telefon | Cyfry, +, *, # |
| decimalPad | Cena, liczba | Cyfry + kropka dziesiętna |
UITextFieldDelegate — to protokół określający zachowanie pola tekstowego na różnych etapach wprowadzania. Główne metody: textFieldShouldBeginEditing(textField) — zwraca Bool, zezwalający lub zabraniający rozpoczęcia edycji; textFieldDidBeginEditing — wywoływana po pojawieniu się klawiatury; textFieldShouldEndEditing — sprawdza, czy można zakończyć edycję (przy false pole nie traci focusu); textFieldDidEndEditing — wywoływana po ukryciu klawiatury; textFieldShouldChangeCharactersInRange — wywoływana przy każdym wprowadzeniu znaku, umożliwia filtrowanie wprowadzania (tylko jeden dozwolony znak, jeśli zwróci false — znak nie zostanie dodany); textFieldShouldReturn — wywoływana przy naciśnięciu Return/Go/Next/Search, używana do przejścia do następnego pola. Delegat nie jest Optional: wszystkie metody mają domyślną implementację, ale do niestandardowego zachowania należy nadpisać odpowiednią metodę.
Metoda shouldReturn — standardowy wzorzec nawigacji między polami formularza. Implementacja: textFieldShouldReturn(textField) — sprawdzamy, który textField wywołał zdarzenie i przenosimy fokus na następne pole przez becomeFirstResponder(). Jeśli to ostatnie pole — wywołujemy resignFirstResponder() do ukrycia klawiatury. Do przechowywania referencji do pól używaj IBOutlet collection lub osobnych IBOutlet dla każdego pola.
isSecureTextEntry — właściwość UITextField, która przy true zastępuje wprowadzane znaki kropkami (•) i blokuje kopiowanie tekstu przez UIMenuController. Używana do pól hasła, PIN-ów, CVV. Przy przełączaniu między trybem secure a zwykłym tekstem (show/hide password) ustaw textField.isSecureTextEntry.toggle(). Ważne: przy zmianie isSecureTextEntry tekst pola jest resetowany — zapisz go wcześniej. LeftView i RightView — to niestandardowe UIView wyświetlane wewnątrz pola wprowadzania z lewej lub prawej strony. Typowe zastosowanie: ikona wyszukiwania w leftView, przycisk "Wyczyść" w rightView. Konfiguracja: textField.leftViewMode = always (zawsze) lub whileEditing (tylko podczas edycji). Left/right view są automatycznie pozycjonowane wewnątrz pola tekstowego z uwzględnieniem paddingu. Rozmiar view jest określany przez bounds lub 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
// Niestandardowy przycisk pokaż/ukryj hasło
let showButton = UIButton(type: .system)
showButton.setTitle("Pokaż", for: .normal)
showButton.addTarget(self, action: #selector(togglePasswordVisibility),
for: .touchUpInside)
passwordField.rightView = showButton
passwordField.rightViewMode = .always
}
@objc func togglePasswordVisibility() {
passwordField.isSecureTextEntry.toggle()
}
}
UITextInputTraits — to protokół, który określa wizualne i behawioralne dostosowanie klawiatury dla UITextField. Główne właściwości: autocorrectionType (.default, .no, .yes) — włącza lub wyłącza autokorektę tekstu; autocapitalizationType (.none, .words, .sentences, .allCharacters) — automatyczny Caps Lock dla pierwszego znaku; spellCheckingType — sprawdzanie pisowni; returnKeyType (.done, .go, .next, .search, .send, .continue, .join, .route, .emergencyCall) — tekst przycisku Return na klawiaturze; enablesReturnKeyAutomatically — automatyczne blokowanie przycisku Return przy pustym polu. Dla pól wprowadzania imienia używaj autocapitalizationType = .words, dla email — autocorrectionType = .no, dla URL — keyboardType = .URL + autocapitalizationType = .none. Konfiguracja traits jest wykonywana po inicjalizacji pola przed jego wyświetleniem. Zmiana traits dynamicznie aktualizuje klawiaturę przy następnym pojawieniu się.
Return Key Type określa tekst przycisku na klawiaturze: Next — przejdź do następnego pola, Done — zakończ wprowadzanie, Search — uruchom wyszukiwanie, Send — wyślij formularz, Continue — kontynuuj wypełnianie. W połączeniu z metodą delegata shouldReturn, returnKeyType pozwala stworzyć naturalny UX: użytkownik wypełnia pola, naciskając Next, aby przejść do następnego, i Done, aby wysłać na ostatnim polu. Do dostosowania tekstu przycisku używaj UIButtonConfiguration w iOS 15+.
Placeholder UITextField — to tekst wyświetlany szarym kolorem, gdy pole jest puste. Konfiguracja: textField.placeholder = "Enter email". Do dostosowania koloru i czcionki placeholder używaj attributedPlaceholder z NSAttributedString. Maska wprowadzania jest implementowana przez metodę delegata shouldChangeCharactersInRange — obsługiwany jest format numeru telefonu, daty, karty kredytowej, SNILS. Maska wprowadzania pozwala oddzielić wyświetlanie od wartości: użytkownik widzi sformatowany tekst (np. +7 (999) 999-99-99), a w modelu przechowywane jest "79999999999". Przykład implementacji: przechowujemy maskę jako ciąg znaków z symbolami X do zastąpienia; przy każdym wprowadzeniu tworzymy sformatowany ciąg i zwracamy false w shouldChangeCharactersInRange, zastępując tekst pola przez textField.text = formattedText. Dla liczb używaj NumberFormatter i dziesiętnego 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 {
// Blokuj spacje w e-mailu
if textField == emailField && string == " " {
return false
}
// Limit długości hasła
if textField == passwordField {
let newLength = (textField.text?.count ?? 0) +
string.count - range.length
return newLength <= 32
}
return true
}
}
Rozważmy pełny przykład implementacji formularza logowania z UITextField, walidacją email i wizualnym feedbackiem. Formularz zawiera dwa pola: emailField (emailAddress keyboard, no autocorrection) i passwordField (secureTextEntry). Walidacja jest wykonywana w shouldChangeCharactersInRange i dodatkowo przy naciśnięciu przycisku Login. Do wizualnego feedbacku: czerwona ramka (layer.borderColor) przy błędzie, zielona — przy pomyślnej walidacji. Reset ramki przy rozpoczęciu edycji w textFieldDidBeginEditing.
Walidacja email jest wykonywana przez NSPredicate z formatem "SELF MATCHES %@" i wyrażeniem regularnym do podstawowego sprawdzenia formatu. Rzeczywiste sprawdzenie istnienia email powinno być wykonane na serwerze. Do zaawansowanej walidacji używaj biblioteki SwiftValidators lub Combine publishers. Przykład: NSPredicate(format: "SELF MATCHES [c] %@", emailRegex).evaluate(with: email). Ramka pola jest aktualizowana przez animation block dla płynnego przejścia.
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
}
}
Często zadawane pytania
Użyj metody delegata shouldChangeCharactersInRange. Oblicz nową długość tekstu jako existingText.count + newText.count - range.length i zwróć false, jeśli limit został przekroczony. Alternatywnie: zasubskrybuj zdarzenie editingChanged przez addTarget i przytnij tekst przez textField.text = String(text.prefix(maxLength)).
Sprawdź: isUserInteractionEnabled = true (domyślnie), delegat nie zwraca false w shouldBeginEditing. Jeśli pole znajduje się wewnątrz UIScrollView — wyłącz delaysContentTouches. Jeśli pole jest w modalnym kontrolerze — sprawdź, czy nie blokuje on dotknięć. Dla SwiftUI UIViewRepresentable sprawdź, czy pole poprawnie staje się firstResponder przez DispatchQueue.main.async.
Dodaj UITapGestureRecognizer do self.view lub scrollView z target-action wywołującym view.endEditing(true). Alternatywa: textField.resignFirstResponder() do ukrycia klawiatury konkretnego pola. Skonfiguruj touchesBegan w UIViewController lub użyj biblioteki IQKeyboardManager do automatycznego zarządzania klawiaturą. Nie zapomnij wyłączyć cancelsTouchesInView dla poprawnego działania przycisków.
Kolor tekstu: textField.textColor = UIColor.label. Czcionka: textField.font = UIFont.systemFont(ofSize: 16, weight: .regular). Kolor placeholder: textField.attributedPlaceholder = NSAttributedString(string: "Email", attributes: [.foregroundColor: UIColor.secondaryLabel]).
Trzy sposoby: isEnabled = false (zmienia wygląd), isUserInteractionEnabled = false (zachowuje styl wizualny) lub zwróć false w textFieldShouldBeginEditing delegata. Trzeci sposób jest preferowany — blokuje wprowadzanie bez zmiany stylu wizualnego. Do programowego ustawienia tekstu w trybie tylko do odczytu używaj delegata.
Podsumowanie
Opracujemy aplikację mobilną pod klucz
IT Sectr tworzy aplikacje na iOS i Androida dla startupów i firm od 2017 roku. Doradzimy Ci i zaproponujemy najlepsze rozwiązanie.
Przeczytaj również