UITextField — е стандартен компонент на UIKit за едноредово въвеждане на текст в iOS, наследяващ UIControl и поддържащ широк спектър от клавиатурни режими. Според документацията на Apple Developer (2025), UITextField предоставя делегат UITextFieldDelegate с колбекове shouldBeginEditing, shouldChangeCharactersInRange и shouldReturn. За разлика от UITextView, UITextField ограничава въвеждането до един ред и поддържа secureTextEntry, leftView и rightView за персонализирани контроли. Това е основният елемент за формуляри за вход, търсене, регистрация и въвеждане на данни в iOS приложения.
Основни точки
UITextField — е клас на UIKit рамката, предназначен за едноредово въвеждане на текст от потребителя. Класът наследява UIControl, което позволява абониране за събития на въвеждане чрез target-action механизма: addTarget(self, action: Selector("textChanged:"), for: editingChanged). UITextField показва рамка (borderStyle), placeholder текст при празно поле, бутон за изчистване (clearButtonMode) и може да съдържа ляв/десен помощен view. Полето автоматично показва/скрива клавиатурата при получаване/загуба на фокус чрез becomeFirstResponder и resignFirstResponder. Размерът на полето се определя от intrinsicContentSize на базата на font и border style. За създаване на UITextField в Interface Builder (Storyboard/XIB) се използва Object Library, програмно — чрез инициализатора UITextField(frame: CGRect). Класът е напълно съвместим с модерната iOS архитектура: Combine publishers, @Published в SwiftUI чрез UIViewRepresentable и Diffable Data Source за формуляри.
UITextField поддържа 12 типа клавиатура чрез свойството keyboardType. Всеки тип оптимизира набора от символи за конкретен сценарий на въвеждане. UIKeyboardType.default — стандартна QWERTY клавиатура. UIKeyboardType.numberPad — само цифри без допълнителни символи (идеално за PIN кодове и телефонни номера). UIKeyboardType.emailAddress — клавиатура със символ @ и точка на основния слой. UIKeyboardType.URL — клавиатура с .com, / и . на основния слой. UIKeyboardType.phonePad — цифрова клавиатура с +, *, # за въвеждане на телефонни номера. UIKeyboardType.decimalPad — цифри с десетична точка за въвеждане на цени. UIKeyboardType.webSearch — клавиатура с бутон Go и оптимизация за търсене. UIKeyboardType.asciiCapable — само ASCII символи за латиница. Клавиатурата се показва при извикване на becomeFirstResponder и се скрива при resignFirstResponder. Типът клавиатура може да се променя динамично по време на редактиране.
| Тип | Сценарий | Характеристики |
|---|---|---|
| default | Общо въвеждане на текст | Стандартна QWERTY |
| numberPad | PIN, код | Само цифри 0-9 |
| emailAddress | Имейл | @ и . на основния слой |
| URL | Уеб адрес | .com, /, . на основния |
| phonePad | Телефон | Цифри, +, *, # |
| decimalPad | Цена, число | Цифри + десетична точка |
UITextFieldDelegate — е протокол, който определя поведението на текстовото поле на различни етапи на въвеждане. Основни методи: textFieldShouldBeginEditing(textField) — връща Bool, разрешаващ или забраняващ започването на редактиране; textFieldDidBeginEditing — извиква се след появата на клавиатурата; textFieldShouldEndEditing — проверява дали редактирането може да приключи (при false полето не губи фокус); textFieldDidEndEditing — извиква се след скриването на клавиатурата; textFieldShouldChangeCharactersInRange — извиква се при всяко въвеждане на символ, позволява филтриране на въвеждането (само един символ е разрешен, ако върне false — символът няма да се добави); textFieldShouldReturn — извиква се при натискане на Return/Go/Next/Search, използва се за преминаване към следващото поле. Делегатът не е Optional: всички методи имат имплементация по подразбиране, но за персонализирано поведение трябва да се override съответния метод.
Методът shouldReturn — стандартен модел за навигация между полетата на формуляра. Имплементация: textFieldShouldReturn(textField) — проверяваме кой textField е предизвикал събитието и преместваме фокуса към следващото поле чрез becomeFirstResponder(). Ако това е последното поле — извикваме resignFirstResponder() за скриване на клавиатурата. За съхранение на референции към полета използвайте IBOutlet collection или отделни IBOutlet за всяко поле.
isSecureTextEntry — свойство на UITextField, което при true замества въведените символи с точки (•) и блокира копирането на текст чрез UIMenuController. Използва се за полета за парола, PIN, CVV. При превключване между защитен режим и обикновен текст (show/hide password) задайте textField.isSecureTextEntry.toggle(). Важно: при промяна на isSecureTextEntry текстът на полето се нулира — запазете го предварително. LeftView и RightView — са персонализирани UIView, показвани вътре в полето за въвеждане отляво или отдясно. Типично използване: икона за търсене в leftView, бутон "Изчисти" в rightView. Настройка: textField.leftViewMode = always (винаги) или whileEditing (само при редактиране). Left/right view се позиционират автоматично вътре в текстовото поле, като се взема предвид padding. Размерът на view се определя чрез bounds или 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
// Персонализиран бутон за показване/скриване на парола
let showButton = UIButton(type: .system)
showButton.setTitle("Покажи", for: .normal)
showButton.addTarget(self, action: #selector(togglePasswordVisibility),
for: .touchUpInside)
passwordField.rightView = showButton
passwordField.rightViewMode = .always
}
@objc func togglePasswordVisibility() {
passwordField.isSecureTextEntry.toggle()
}
}
UITextInputTraits — е протокол, който определя визуалното и поведенческо настрояване на клавиатурата за UITextField. Основни свойства: autocorrectionType (.default, .no, .yes) — включва или изключва автоматичното коригиране на текст; autocapitalizationType (.none, .words, .sentences, .allCharacters) — автоматичен Caps Lock за първия символ; spellCheckingType — проверка на правописа; returnKeyType (.done, .go, .next, .search, .send, .continue, .join, .route, .emergencyCall) — текст на бутона Return на клавиатурата; enablesReturnKeyAutomatically — автоматично блокиране на бутона Return при празно поле. За полета за въвеждане на име използвайте autocapitalizationType = .words, за имейл — autocorrectionType = .no, за URL — keyboardType = .URL + autocapitalizationType = .none. Настройката на traits се извършва след инициализация на полето преди показването му. Промяната на traits динамично актуализира клавиатурата при следващото показване.
Return Key Type определя текста на бутона на клавиатурата: Next — премини към следващото поле, Done — завърши въвеждането, Search — стартирай търсене, Send — изпрати формуляра, Continue — продължи попълването. В комбинация с делегатния метод shouldReturn, returnKeyType позволява създаването на естествен UX: потребителят попълва полета, натискайки Next за преминаване към следващото и Done за изпращане на последното поле. За персонализиране на текста на бутона използвайте UIButtonConfiguration в iOS 15+.
Placeholder UITextField — е текстът, показван в сиво, когато полето е празно. Настройка: textField.placeholder = "Enter email". За персонализиране на цвета и шрифта на placeholder използвайте attributedPlaceholder с NSAttributedString. Маска за въвеждане се имплементира чрез делегатния метод shouldChangeCharactersInRange — поддържа се формат на телефонен номер, дата, кредитна карта, SNILS. Маската за въвеждане позволява разделяне на показването и стойността: потребителят вижда форматиран текст (напр. +7 (999) 999-99-99), а в модела се съхранява "79999999999". Пример за имплементация: съхраняваме маската като низ със символи X за замяна; при всяко въвеждане създаваме форматиран низ и връщаме false в shouldChangeCharactersInRange, заменяйки текста на полето чрез textField.text = formattedText. За числа използвайте NumberFormatter и 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 {
// Блокиране на интервали в имейл
if textField == emailField && string == " " {
return false
}
// Ограничение на дължината на паролата
if textField == passwordField {
let newLength = (textField.text?.count ?? 0) +
string.count - range.length
return newLength <= 32
}
return true
}
}
Нека разгледаме пълен пример за имплементация на формуляр за вход с UITextField, валидация на имейл и визуална обратна връзка. Формулярът съдържа две полета: emailField (emailAddress клавиатура, без автоматично коригиране) и passwordField (secureTextEntry). Валидацията се извършва в shouldChangeCharactersInRange и допълнително при натискане на бутона Login. За визуална обратна връзка: червена рамка (layer.borderColor) при грешка, зелена — при успешна валидация. Нулиране на рамката при започване на редактиране в textFieldDidBeginEditing.
Валидация на имейл се извършва чрез NSPredicate с формат "SELF MATCHES %@" и регулярен израз за основна проверка на формата. Реалната проверка за съществуване на имейл трябва да се извърши на сървъра. За разширена валидация използвайте библиотеката SwiftValidators или Combine publishers. Пример: NSPredicate(format: "SELF MATCHES [c] %@", emailRegex).evaluate(with: email). Рамката на полето се актуализира чрез animation block за плавен преход.
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
}
}
Често задавани въпроси
Използвайте делегатния метод shouldChangeCharactersInRange. Изчислете новата дължина на текста като existingText.count + newText.count - range.length и върнете false, ако лимитът е надвишен. Алтернативно: абонирайте се за събитието editingChanged чрез addTarget и отрежете текста чрез textField.text = String(text.prefix(maxLength)).
Проверете: isUserInteractionEnabled = true (по подразбиране), делегатът не връща false в shouldBeginEditing. Ако полето е вътре в UIScrollView — изключете delaysContentTouches. Ако полето е в модален контролер — проверете дали не блокира докосванията. За SwiftUI UIViewRepresentable проверете дали полето правилно става firstResponder чрез DispatchQueue.main.async.
Добавете UITapGestureRecognizer към self.view или scrollView с target-action, който извиква view.endEditing(true). Алтернатива: textField.resignFirstResponder() за скриване на клавиатурата на конкретно поле. Настройте touchesBegan в UIViewController или използвайте библиотеката IQKeyboardManager за автоматично управление на клавиатурата. Не забравяйте да изключите cancelsTouchesInView за правилната работа на бутоните.
Цвят на текста: textField.textColor = UIColor.label. Шрифт: textField.font = UIFont.systemFont(ofSize: 16, weight: .regular). Цвят на placeholder: textField.attributedPlaceholder = NSAttributedString(string: "Email", attributes: [.foregroundColor: UIColor.secondaryLabel]).
Три начина: isEnabled = false (променя външния вид), isUserInteractionEnabled = false (запазва визуалния стил) или върнете false в textFieldShouldBeginEditing на делегата. Третият начин е за предпочитане — блокира въвеждането без промяна на визуалния стил. За програмно задаване на текст в режим само за четене използвайте делегата.
Обобщение
Ще разработим мобилно приложение под ключ
IT Sectr създава iOS и Android приложения за стартъпи и бизнеси от 2017 г. Ще ви консултираме и ще предложим най-доброто решение.
Прочетете също