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), текст-плейсхолдер, коли поле порожнє, кнопку очищення (clearButtonMode) та може містити ліву/праву допоміжні view. Поле автоматично показує/ховує клавіатуру при отриманні/втраті фокусу через becomeFirstResponder та resignFirstResponder. Розмір поля визначається intrinsicContentSize на основі шрифту та стилю рамки. Для створення 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: всі методи мають реалізацію за замовчуванням, але для кастомної поведінки потрібно перевизначити відповідний метод.
Метод 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 автоматично позиціонуються всередині текстового поля з урахуванням відступів. Розмір 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, для email — 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 — підтримується формат номера телефону, дати, кредитної картки, СНІЛС. Маска введення дозволяє розділити відображення та значення: користувач бачить форматований текст (наприклад, +7 (999) 999-99-99), а в моделі зберігається "79999999999". Приклад реалізації: зберігаємо маску як рядок із символами X для заміни; при кожному введенні формуємо відформатований рядок та повертаємо false в shouldChangeCharactersInRange, замінюючи текст поля через textField.text = formattedText. Для чисел використовуйте NumberFormatter та десятковий 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 {
// Блокувати пробіли в email
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, валідацією email та візуальним зворотним зв'язком. Форма містить два поля: emailField (emailAddress keyboard, без автовиправлення) та passwordField (secureTextEntry). Валідація виконується в shouldChangeCharactersInRange та додатково при натисканні кнопки Login. Для візуального зворотного зв'язку: червона рамка (layer.borderColor) при помилці, зелена — при успішній валідації. Скидання рамки при початку редагування в textFieldDidBeginEditing.
Валідація email виконується через NSPredicate з форматом "SELF MATCHES %@" та регулярним виразом для базової перевірки формату. Реальна перевірка існування email повинна виконуватися на сервері. Для розширеної валідації використовуйте бібліотеку 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 року. Ми проконсультуємо вас і запропонуємо найкраще рішення.
Читайте також