UITextField — je standardní komponenta UIKit pro jednořádkový vstup textu v iOS, dědící z UIControl a podporující širokou škálu režimů klávesnice. Podle dokumentace Apple Developer (2025) poskytuje UITextField delegáta UITextFieldDelegate s callbacky shouldBeginEditing, shouldChangeCharactersInRange a shouldReturn. Na rozdíl od UITextView, UITextField omezuje vstup na jeden řádek a podporuje secureTextEntry, leftView a rightView pro vlastní ovládací prvky. Toto je hlavní prvek pro přihlašovací, vyhledávací, registrační formuláře a vstup dat v iOS aplikacích.
Hlavní body
UITextField — je třída frameworku UIKit určená pro jednořádkový vstup textu uživatelem. Třída dědí z UIControl, což umožňuje přihlášení k odběru vstupních událostí pomocí mechanismu target-action: addTarget(self, action: Selector("textChanged:"), for: editingChanged). UITextField zobrazuje rámeček (borderStyle), zástupný text (placeholder) při prázdném poli, tlačítko vymazání (clearButtonMode) a může obsahovat levý/pravý pomocný pohled. Pole automaticky zobrazuje/skryje klávesnici při přijetí/ztrátě fokusu pomocí becomeFirstResponder a resignFirstResponder. Velikost pole je určena intrinsicContentSize na základě font a border style. Pro vytvoření UITextField v Interface Builder (Storyboard/XIB) se používá Object Library, programově — pomocí inicializátoru UITextField(frame: CGRect). Třída je plně kompatibilní s moderní architekturou iOS: Combine publishers, @Published ve SwiftUI přes UIViewRepresentable a Diffable Data Source pro formuláře.
UITextField podporuje 12 typů klávesnice pomocí vlastnosti keyboardType. Každý typ optimalizuje sadu znaků pro konkrétní scénář vstupu. UIKeyboardType.default — standardní klávesnice QWERTY. UIKeyboardType.numberPad — pouze číslice bez dalších znaků (ideální pro PIN kódy a telefonní čísla). UIKeyboardType.emailAddress — klávesnice se znakem @ a tečkou na hlavní vrstvě. UIKeyboardType.URL — klávesnice s .com, / a . na hlavní vrstvě. UIKeyboardType.phonePad — numerická klávesnice s +, *, # pro zadávání telefonních čísel. UIKeyboardType.decimalPad — číslice s desetinnou tečkou pro zadávání cen. UIKeyboardType.webSearch — klávesnice s tlačítkem Go a optimalizací pro vyhledávací dotazy. UIKeyboardType.asciiCapable — pouze znaky ASCII pro latinku. Klávesnice se zobrazí při volání becomeFirstResponder a skryje při resignFirstResponder. Typ klávesnice lze dynamicky měnit během úprav.
| Typ | Scénář | Vlastnosti |
|---|---|---|
| default | Obecný vstup textu | Standardní QWERTY |
| numberPad | PIN, kód | Pouze číslice 0-9 |
| emailAddress | @ a . na hlavní vrstvě | |
| URL | Webová adresa | .com, /, . na hlavní |
| phonePad | Telefon | Číslice, +, *, # |
| decimalPad | Cena, číslo | Číslice + desetinná tečka |
UITextFieldDelegate — je protokol definující chování textového pole v různých fázích vstupu. Hlavní metody: textFieldShouldBeginEditing(textField) — vrací Bool, povolující nebo zakazující zahájení úprav; textFieldDidBeginEditing — volá se po zobrazení klávesnice; textFieldShouldEndEditing — kontroluje, zda lze úpravy ukončit (při false pole neztrácí fokus); textFieldDidEndEditing — volá se po skrytí klávesnice; textFieldShouldChangeCharactersInRange — volá se při každém vstupu znaku, umožňuje filtrování vstupu (pouze jeden znak povolen, pokud vrátí false — znak se nepřidá); textFieldShouldReturn — volá se při stisknutí Return/Go/Next/Search, používá se pro přechod na další pole. Delegát není Optional: všechny metody mají výchozí implementaci, ale pro vlastní chování je třeba přepsat odpovídající metodu.
Metoda shouldReturn — standardní vzor pro navigaci mezi poli formuláře. Implementace: textFieldShouldReturn(textField) — zkontrolujeme, které textField spustilo událost a přesuneme fokus na další pole pomocí becomeFirstResponder(). Pokud je to poslední pole — zavoláme resignFirstResponder() pro skrytí klávesnice. Pro ukládání odkazů na pole použijte IBOutlet collection nebo samostatné IBOutlet pro každé pole.
isSecureTextEntry — vlastnost UITextField, která při true nahrazuje zadávané znaky tečkami (•) a blokuje kopírování textu přes UIMenuController. Používá se pro pole hesla, PIN, CVV. Při přepínání mezi zabezpečeným režimem a běžným textem (show/hide password) nastavte textField.isSecureTextEntry.toggle(). Důležité: při změně isSecureTextEntry se text pole resetuje — uložte jej předem. LeftView a RightView — jsou vlastní UIView zobrazené uvnitř vstupního pole vlevo nebo vpravo. Typické použití: ikona vyhledávání v leftView, tlačítko "Vymazat" v rightView. Nastavení: textField.leftViewMode = always (vždy) nebo whileEditing (pouze při úpravách). Left/right view se automaticky umisťují uvnitř textového pole s ohledem na padding. Velikost view se určuje pomocí bounds nebo 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
// Vlastní tlačítko pro zobrazení/skrytí hesla
let showButton = UIButton(type: .system)
showButton.setTitle("Zobrazit", for: .normal)
showButton.addTarget(self, action: #selector(togglePasswordVisibility),
for: .touchUpInside)
passwordField.rightView = showButton
passwordField.rightViewMode = .always
}
@objc func togglePasswordVisibility() {
passwordField.isSecureTextEntry.toggle()
}
}
UITextInputTraits — je protokol, který definuje vizuální a behaviorální přizpůsobení klávesnice pro UITextField. Hlavní vlastnosti: autocorrectionType (.default, .no, .yes) — zapíná nebo vypíná automatickou opravu textu; autocapitalizationType (.none, .words, .sentences, .allCharacters) — automatický Caps Lock pro první znak; spellCheckingType — kontrola pravopisu; returnKeyType (.done, .go, .next, .search, .send, .continue, .join, .route, .emergencyCall) — text tlačítka Return na klávesnici; enablesReturnKeyAutomatically — automatické blokování tlačítka Return při prázdném poli. Pro pole pro zadání jména použijte autocapitalizationType = .words, pro email — autocorrectionType = .no, pro URL — keyboardType = .URL + autocapitalizationType = .none. Nastavení traits se provádí po inicializaci pole před jeho zobrazením. Změna traits dynamicky aktualizuje klávesnici při příštím zobrazení.
Return Key Type určuje text tlačítka na klávesnici: Next — přejít na další pole, Done — dokončit vstup, Search — spustit vyhledávání, Send — odeslat formulář, Continue — pokračovat ve vyplňování. V kombinaci s delegátní metodou shouldReturn umožňuje returnKeyType vytvořit přirozené UX: uživatel vyplňuje pole, mačká Next pro přechod na další a Done pro odeslání na posledním poli. Pro přizpůsobení textu tlačítka použijte UIButtonConfiguration v iOS 15+.
Placeholder UITextField — je text zobrazený šedě, když je pole prázdné. Nastavení: textField.placeholder = "Enter email". Pro přizpůsobení barvy a fontu placeholderu použijte attributedPlaceholder s NSAttributedString. Maska vstupu je implementována pomocí delegátní metody shouldChangeCharactersInRange — podporován je formát telefonního čísla, data, kreditní karty, SNILS. Maska vstupu umožňuje oddělit zobrazení od hodnoty: uživatel vidí formátovaný text (např. +7 (999) 999-99-99), zatímco v modelu je uloženo "79999999999". Příklad implementace: masku ukládáme jako řetězec se symboly X pro nahrazení; při každém vstupu vytvoříme formátovaný řetězec a vrátíme false v shouldChangeCharactersInRange, nahrazujeme text pole pomocí textField.text = formattedText. Pro čísla použijte NumberFormatter a desetinný 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 {
// Blokovat mezery v emailu
if textField == emailField && string == " " {
return false
}
// Limit délky hesla
if textField == passwordField {
let newLength = (textField.text?.count ?? 0) +
string.count - range.length
return newLength <= 32
}
return true
}
}
Podívejme se na úplný příklad implementace přihlašovacího formuláře s UITextField, validací emailu a vizuální zpětnou vazbou. Formulář obsahuje dvě pole: emailField (klávesnice emailAddress, bez automatické opravy) a passwordField (secureTextEntry). Validace se provádí v shouldChangeCharactersInRange a dodatečně při stisknutí tlačítka Login. Pro vizuální zpětnou vazbu: červený rámeček (layer.borderColor) při chybě, zelený — při úspěšné validaci. Reset rámečku při zahájení úprav v textFieldDidBeginEditing.
Validace emailu se provádí pomocí NSPredicate s formátem "SELF MATCHES %@" a regulárním výrazem pro základní kontrolu formátu. Skutečná kontrola existence emailu by měla být provedena na serveru. Pro pokročilou validaci použijte knihovnu SwiftValidators nebo Combine publishers. Příklad: NSPredicate(format: "SELF MATCHES [c] %@", emailRegex).evaluate(with: email). Rámeček pole se aktualizuje pomocí animation block pro plynulý přechod.
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
}
}
Často kladené otázky
Použijte delegátní metodu shouldChangeCharactersInRange. Vypočítejte novou délku textu jako existingText.count + newText.count - range.length a vraťte false, pokud je limit překročen. Alternativně: přihlaste se k odběru události editingChanged přes addTarget a zkraťte text pomocí textField.text = String(text.prefix(maxLength)).
Zkontrolujte: isUserInteractionEnabled = true (výchozí), delegát nevrací false v shouldBeginEditing. Pokud je pole uvnitř UIScrollView — vypněte delaysContentTouches. Pokud je pole v modálním řadiči — zkontrolujte, že neblokuje dotyky. Pro SwiftUI UIViewRepresentable zkontrolujte, že se pole správně stává firstResponder přes DispatchQueue.main.async.
Přidejte UITapGestureRecognizer na self.view nebo scrollView s target-action volajícím view.endEditing(true). Alternativa: textField.resignFirstResponder() pro skrytí klávesnice konkrétního pole. Nakonfigurujte touchesBegan v UIViewController nebo použijte knihovnu IQKeyboardManager pro automatickou správu klávesnice. Nezapomeňte vypnout cancelsTouchesInView pro správnou funkci tlačítek.
Barva textu: textField.textColor = UIColor.label. Písmo: textField.font = UIFont.systemFont(ofSize: 16, weight: .regular). Barva placeholderu: textField.attributedPlaceholder = NSAttributedString(string: "Email", attributes: [.foregroundColor: UIColor.secondaryLabel]).
Tři způsoby: isEnabled = false (mění vzhled), isUserInteractionEnabled = false (zachovává vizuální styl) nebo vraťte false v textFieldShouldBeginEditing delegáta. Třetí způsob je preferovaný — blokuje vstup bez změny vizuálního stylu. Pro programové nastavení textu v režimu pouze pro čtení použijte delegáta.
Shrnutí
Vyvineme mobilní aplikaci na klíč
IT Sectr vytváří aplikace pro iOS a Android pro startupy a podniky od roku 2017. Poradíme vám a navrhneme nejlepší řešení.
Přečtěte si také