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: все методы имеют реализацию по умолчанию, но для кастомного поведения нужно переопределить соответствующий метод.
Метод shouldReturn — стандартный паттерн для навигации между полями формы. Реализация: textFieldShouldReturn(textField) — проверяем какой textField вызвал событие и переводим фокус на следующее поле через becomeFirstResponder(). Если это последнее поле — вызываем resignFirstResponder() для скрытия клавиатуры. Для хранения ссылок на поля используйте IBOutlet collection или отдельные IBOutlet для каждого поля.
isSecureTextEntry — свойство UITextField, которое при true заменяет вводимые символы на дужки (•) и блокирует копирование текста через UIMenuController. Используется для полей пароля, PIN-кодов, CVV. При переключении между secure режимом и обычным текстом (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
// Custom show/hide password button
let showButton = UIButton(type: .system)
showButton.setTitle("Show", 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 {
// Block spaces in email
if textField == emailField && string == " " {
return false
}
// Password length limit
if textField == passwordField {
let newLength = (textField.text?.count ?? 0) +
string.count - range.length
return newLength <= 32
}
return true
}
}
Рассмотрим полный пример реализации формы входа с UITextField, валидацией email и визуальной обратной связью. Форма содержит два поля: emailField (emailAddress keyboard, no autocorrection) и passwordField (secureTextEntry). Валидация выполняется в shouldChangeCharactersInRange и дополнительно при нажатии кнопки Login. Для визуальной обратной связи: красная рамка (layer.borderColor) при ошибке, зелёная — при успешной валидации. Сброс рамки при начале редактирования в textFieldDidBeginEditing.
Валидация email выполняется через NSPredicate с форматом "SELF MATCHES %@" и регулярным выражением для базовой проверки формата. Реальная проверка существования email должна выполняться на сервере. Для advanced валидации используйте библиотеку 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 делегата. Третий способ предпочтительнее — он блокирует ввод без изменения визуального стиля. Для программной установки текста в read-only режиме используйте делегат.
Итоги
Мы разработаем мобильное приложение под ключ
IT Sectr создаёт приложения для iOS и Android для стартапов и бизнеса с 2017 года. Мы проконсультируем вас и предложим наилучшее решение.
Читайте также