UITextField — är en standard UIKit-komponent för textinmatning på en rad i iOS, som ärver UIControl och stöder ett brett spektrum av tangentbordslägen. Enligt Apple Developer (2025)-dokumentationen tillhandahåller UITextField delegaten UITextFieldDelegate med callbacks shouldBeginEditing, shouldChangeCharactersInRange och shouldReturn. Till skillnad från UITextView begränsar UITextField inmatning till en rad och stöder secureTextEntry, leftView och rightView för anpassade kontroller. Detta är huvudelementet för inloggnings-, sök-, registrerings- och datainmatningsformulär i iOS-appar.
Huvudpunkter
UITextField — är en klass i UIKit-ramverket avsedd för enradig textinmatning av användaren. Klassen ärver UIControl, vilket möjliggör prenumeration på inmatningshändelser via target-action-mekanismen: addTarget(self, action: Selector("textChanged:"), for: editingChanged). UITextField visar ram (borderStyle), platshållartext när fältet är tomt, rensningsknapp (clearButtonMode) och kan innehålla vänster/höger hjälpvyer. Fältet visar/döljer automatiskt tangentbordet vid mottagning/förlust av fokus via becomeFirstResponder och resignFirstResponder. Fältets storlek bestäms av intrinsicContentSize baserat på teckensnitt och border style. För att skapa UITextField i Interface Builder (Storyboard/XIB) används Object Library, programmatiskt — via initieraren UITextField(frame: CGRect). Klassen är fullt kompatibel med modern iOS-arkitektur: Combine publishers, @Published i SwiftUI via UIViewRepresentable och Diffable Data Source för formulär.
UITextField stöder 12 tangentbordstyper via egenskapen keyboardType. Varje typ optimerar teckenuppsättningen för ett specifikt inmatningsscenario. UIKeyboardType.default — standard QWERTY-tangentbord. UIKeyboardType.numberPad — endast siffror utan extra tecken (idealisk för PIN-koder och telefonnummer). UIKeyboardType.emailAddress — tangentbord med @-tecken och punkt på huvudlagret. UIKeyboardType.URL — tangentbord med .com, / och . på huvudlagret. UIKeyboardType.phonePad — numeriskt tangentbord med +, *, # för inmatning av telefonnummer. UIKeyboardType.decimalPad — siffror med decimalpunkt för inmatning av priser. UIKeyboardType.webSearch — tangentbord med Go-knapp och optimering för sökfrågor. UIKeyboardType.asciiCapable — endast ASCII-tecken för latinska alfabetet. Tangentbordet visas vid anrop av becomeFirstResponder och döljs vid resignFirstResponder. Tangentbordstypen kan ändras dynamiskt under redigering.
| Typ | Scenario | Funktioner |
|---|---|---|
| default | Allmän textinmatning | Standard QWERTY |
| numberPad | PIN, kod | Endast siffror 0-9 |
| emailAddress | E-post | @ och . på huvudlagret |
| URL | Webbadress | .com, /, . på huvudlagret |
| phonePad | Telefon | Siffror, +, *, # |
| decimalPad | Pris, tal | Siffror + decimalpunkt |
UITextFieldDelegate — är ett protokoll som definierar textfältets beteende i olika faser av inmatning. Huvudmetoder: textFieldShouldBeginEditing(textField) — returnerar Bool, som tillåter eller förbjuder att påbörja redigering; textFieldDidBeginEditing — anropas efter att tangentbordet visas; textFieldShouldEndEditing — kontrollerar om redigering kan avslutas (vid false förlorar fältet inte fokus); textFieldDidEndEditing — anropas efter att tangentbordet dolts; textFieldShouldChangeCharactersInRange — anropas vid varje teckeninmatning, möjliggör filtrering av inmatning (endast ett tecken tillåtet, om false returneras läggs tecknet inte till); textFieldShouldReturn — anropas vid tryck på Return/Go/Next/Search, används för att gå till nästa fält. Delegaten är inte Optional: alla metoder har standardimplementering, men för anpassat beteende måste motsvarande metod överskrivas.
Metoden shouldReturn — standardmönster för navigering mellan formulärfält. Implementering: textFieldShouldReturn(textField) — vi kontrollerar vilket textField som utlöste händelsen och flyttar fokus till nästa fält via becomeFirstResponder(). Om detta är det sista fältet — anropar vi resignFirstResponder() för att dölja tangentbordet. För att lagra referenser till fält, använd IBOutlet collection eller separata IBOutlet för varje fält.
isSecureTextEntry — egenskap hos UITextField som vid true ersätter inmatade tecken med punkter (•) och blockerar kopiering av text via UIMenuController. Används för lösenords-, PIN- och CVV-fält. Vid växling mellan säkert läge och vanlig text (show/hide password) ställ in textField.isSecureTextEntry.toggle(). Viktigt: vid ändring av isSecureTextEntry återställs fältets text — spara den i förväg. LeftView och RightView — är anpassade UIView som visas inuti inmatningsfältet till vänster eller höger. Typisk användning: sökikon i leftView, knappen "Rensa" i rightView. Konfiguration: textField.leftViewMode = always (alltid) eller whileEditing (endast vid redigering). Left/right view positioneras automatiskt inuti textfältet med hänsyn till padding. Viewens storlek bestäms av bounds eller 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
// Anpassad knapp för att visa/dölja lösenord
let showButton = UIButton(type: .system)
showButton.setTitle("Visa", for: .normal)
showButton.addTarget(self, action: #selector(togglePasswordVisibility),
for: .touchUpInside)
passwordField.rightView = showButton
passwordField.rightViewMode = .always
}
@objc func togglePasswordVisibility() {
passwordField.isSecureTextEntry.toggle()
}
}
UITextInputTraits — är ett protokoll som definierar visuell och beteendemässig anpassning av tangentbordet för UITextField. Huvudegenskaper: autocorrectionType (.default, .no, .yes) — aktiverar eller avaktiverar automatisk korrigering av text; autocapitalizationType (.none, .words, .sentences, .allCharacters) — automatisk Caps Lock för första tecknet; spellCheckingType — stavningskontroll; returnKeyType (.done, .go, .next, .search, .send, .continue, .join, .route, .emergencyCall) — text på Return-knappen på tangentbordet; enablesReturnKeyAutomatically — automatisk blockering av Return-knappen när fältet är tomt. För namninmatningsfält använd autocapitalizationType = .words, för e-post — autocorrectionType = .no, för URL — keyboardType = .URL + autocapitalizationType = .none. Konfiguration av traits utförs efter initiering av fältet före dess visning. Ändring av traits uppdaterar dynamiskt tangentbordet vid nästa visning.
Return Key Type bestämmer texten på knappen på tangentbordet: Next — gå till nästa fält, Done — avsluta inmatning, Search — starta sökning, Send — skicka formulär, Continue — fortsätt ifyllning. I kombination med delegatmetoden shouldReturn möjliggör returnKeyType att skapa en naturlig UX: användaren fyller i fält, trycker på Next för att gå till nästa och Done för att skicka på det sista fältet. För anpassning av knapptext, använd UIButtonConfiguration i iOS 15+.
Placeholder UITextField — är texten som visas i grått när fältet är tomt. Konfiguration: textField.placeholder = "Enter email". För anpassning av färg och teckensnitt på placeholder, använd attributedPlaceholder med NSAttributedString. Inmatningsmask implementeras via delegatmetoden shouldChangeCharactersInRange — format för telefonnummer, datum, kreditkort, SNILS stöds. Inmatningsmasken möjliggör separation av visning och värde: användaren ser formaterad text (t.ex. +7 (999) 999-99-99), medan modellen lagrar "79999999999". Implementeringsexempel: vi lagrar masken som en sträng med X-symboler för ersättning; vid varje inmatning skapar vi en formaterad sträng och returnerar false i shouldChangeCharactersInRange, ersätter fältets text via textField.text = formattedText. För siffror, använd NumberFormatter och 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 {
// Blockera mellanslag i e-post
if textField == emailField && string == " " {
return false
}
// Lösenordslängdsgräns
if textField == passwordField {
let newLength = (textField.text?.count ?? 0) +
string.count - range.length
return newLength <= 32
}
return true
}
}
Låt oss titta på ett komplett exempel på implementering av ett inloggningsformulär med UITextField, e-postvalidering och visuell återkoppling. Formuläret innehåller två fält: emailField (emailAddress-tangentbord, ingen automatisk korrigering) och passwordField (secureTextEntry). Validering utförs i shouldChangeCharactersInRange och ytterligare vid tryck på Login-knappen. För visuell återkoppling: röd ram (layer.borderColor) vid fel, grön — vid framgångsrik validering. Återställning av ramen vid påbörjad redigering i textFieldDidBeginEditing.
E-postvalidering utförs via NSPredicate med formatet "SELF MATCHES %@" och ett reguljärt uttryck för grundläggande formatkontroll. Den faktiska kontrollen av e-postens existens bör utföras på servern. För avancerad validering, använd biblioteket SwiftValidators eller Combine publishers. Exempel: NSPredicate(format: "SELF MATCHES [c] %@", emailRegex).evaluate(with: email). Fältets ram uppdateras via animation block för smidig övergång.
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
}
}
Vanliga frågor
Använd delegatmetoden shouldChangeCharactersInRange. Beräkna den nya textlängden som existingText.count + newText.count - range.length och returnera false om gränsen har överskridits. Alternativt: prenumerera på händelsen editingChanged via addTarget och trunkera texten via textField.text = String(text.prefix(maxLength)).
Kontrollera: isUserInteractionEnabled = true (standard), delegaten returnerar inte false i shouldBeginEditing. Om fältet är inuti UIScrollView — inaktivera delaysContentTouches. Om fältet är i en modal kontroller — kontrollera att den inte blockerar beröringar. För SwiftUI UIViewRepresentable kontrollera att fältet korrekt blir firstResponder via DispatchQueue.main.async.
Lägg till UITapGestureRecognizer på self.view eller scrollView med target-action som anropar view.endEditing(true). Alternativ: textField.resignFirstResponder() för att dölja tangentbordet för ett specifikt fält. Konfigurera touchesBegan i UIViewController eller använd biblioteket IQKeyboardManager för automatisk tangentbordshantering. Glöm inte att inaktivera cancelsTouchesInView för korrekt funktion av knappar.
Textfärg: textField.textColor = UIColor.label. Teckensnitt: textField.font = UIFont.systemFont(ofSize: 16, weight: .regular). Placeholderfärg: textField.attributedPlaceholder = NSAttributedString(string: "Email", attributes: [.foregroundColor: UIColor.secondaryLabel]).
Tre sätt: isEnabled = false (ändrar utseende), isUserInteractionEnabled = false (behåller visuell stil) eller returnera false i textFieldShouldBeginEditing hos delegaten. Det tredje sättet är att föredra — det blockerar inmatning utan att ändra den visuella stilen. För programmatisk inställning av text i skrivskyddat läge, använd delegaten.
Sammanfattning
Vi utvecklar en mobil applikation nyckelfärdigt
IT Sectr skapar iOS- och Android-applikationer för startups och företag sedan 2017. Vi ger dig råd och föreslår den bästa lösningen.
Läs också