UITextField — что это, настройка поля ввода и принцип работы

Автор: IT Sectr Опубликовано: 2026-07-06 Время чтения: 8 мин

UITextField — это стандартный компонент UIKit для однострочного ввода текста в iOS, наследующий UIControl и поддерживающий широкий спектр клавиатурных режимов. По документации Apple Developer (2025), UITextField предоставляет делегат UITextFieldDelegate с колбэками shouldBeginEditing, shouldChangeCharactersInRange и shouldReturn. В отличие от UITextView, UITextField ограничивает ввод одной строкой и поддерживает secureTextEntry, leftView и rightView для кастомных контролов. Это основной элемент для форм авторизации, поиска, регистрации и ввода данных в iOS приложениях.

Главное

  • UITextField — однострочное поле ввода UIKit с поддержкой делегата и кастомных клавиатур
  • UIKeyboardType — 12 типов клавиатуры: numberPad, emailAddress, URL, phonePad и другие
  • UITextFieldDelegate — управление жизненным циклом ввода через shouldBegin/End/Change колбэки
  • Secure Text Entry — режим ввода пароля с заменой символов на дужки через isSecureTextEntry
  • Left/Right View — кастомные иконки и кнопки внутри поля ввода для UX-улучшений

Что такое UITextField

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 для форм.

Типы клавиатуры UIKeyboardType

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
numberPadPIN, кодТолько цифры 0-9
emailAddressEmail@ и . на главном слое
URLВеб-адрес.com, /, . на главном
phonePadТелефонЦифры, +, *, #
decimalPadЦена, числоЦифры + десятичная точка

Делегат UITextFieldDelegate и его методы

UITextFieldDelegate — это протокол, определяющий поведение текстового поля на разных этапах ввода. Основные методы: textFieldShouldBeginEditing(textField) — возвращает Bool, разрешающий или запрещающий начало редактирования; textFieldDidBeginEditing — вызывается после появления клавиатуры; textFieldShouldEndEditing — проверяет, можно ли завершить редактирование (при false поле не теряет фокус); textFieldDidEndEditing — вызывается после скрытия клавиатуры; textFieldShouldChangeCharactersInRange — вызывается при каждом вводе символа, позволяет фильтровать ввод (разрешён только один символ, если вернуть false — символ не добавится); textFieldShouldReturn — вызывается при нажатии Return/Go/Next/Search, используется для перехода к следующему полю. Делегат не является Optional: все методы имеют реализацию по умолчанию, но для кастомного поведения нужно переопределить соответствующий метод.

Управление фокусом через shouldReturn

Метод shouldReturn — стандартный паттерн для навигации между полями формы. Реализация: textFieldShouldReturn(textField) — проверяем какой textField вызвал событие и переводим фокус на следующее поле через becomeFirstResponder(). Если это последнее поле — вызываем resignFirstResponder() для скрытия клавиатуры. Для хранения ссылок на поля используйте IBOutlet collection или отдельные IBOutlet для каждого поля.

Secure Text Entry и кастомные left/right view

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.

swift
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

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 и навигация по форме

Return Key Type определяет текст кнопки на клавиатуре: Next — перейти к следующему полю, Done — завершить ввод, Search — запустить поиск, Send — отправить форму, Continue — продолжить заполнение. В сочетании с делегатным методом shouldReturn, returnKeyType позволяет создать естественный UX: пользователь заполняет поля, нажимая Next для перехода к следующему, и Done для отправки на последнем поле. Для кастомизации текста кнопки используйте UIButtonConfiguration в iOS 15+.

Placeholder, форматирование и маска ввода

Placeholder UITextField — это текст, отображаемый серым цветом, когда поле пустое. Настройка: textField.placeholder = "Enter email". Для кастомизации цвета и шрифта placeholder используйте attributedPlaceholder с NSAttributedString. Маска ввода реализуется через делегатный метод shouldChangeCharactersInRange — поддерживается формат номера телефона, даты, кредитной карты, СНИЛС. Маска ввода позволяет разделить отображение и значение: пользователь видит форматированный текст (например, +7 (999) 999-99-99), а в модели хранится "79999999999". Пример реализации: храним маску как строку с символами X для замены; при каждом вводе формируем отформатированную строку и возвращаем false в shouldChangeCharactersInRange, заменяя текст поля через textField.text = formattedText. Для чисел используйте NumberFormatter и десятичный keyboardType.

swift
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 с регулярным выражением

Валидация email выполняется через NSPredicate с форматом "SELF MATCHES %@" и регулярным выражением для базовой проверки формата. Реальная проверка существования email должна выполняться на сервере. Для advanced валидации используйте библиотеку SwiftValidators или Combine publishers. Пример: NSPredicate(format: "SELF MATCHES [c] %@", emailRegex).evaluate(with: email). Рамка поля обновляется через animation block для плавного перехода.

swift
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
    }
}

Часто задаваемые вопросы

Как ограничить количество символов в UITextField?

Используйте делегатный метод shouldChangeCharactersInRange. Вычислите новую длину текста как existingText.count + newText.count - range.length и верните false, если превышен лимит. Альтернативно: подпишитесь на событие editingChanged через addTarget и обрезайте текст через textField.text = String(text.prefix(maxLength)).

Почему UITextField не реагирует на нажатие?

Проверьте: isUserInteractionEnabled = true (по умолчанию), делегат не возвращает false в shouldBeginEditing. Если поле внутри UIScrollView — отключите delaysContentTouches. Если поле в модальном контроллере — проверьте, что он не блокирует касания. Для SwiftUI UIViewRepresentable проверьте, что поле корректно становится firstResponder через DispatchQueue.main.async.

Как скрыть клавиатуру по тапу вне UITextField?

Добавьте UITapGestureRecognizer на self.view или scrollView с target-action, вызывающим view.endEditing(true). Альтернатива: textField.resignFirstResponder() для скрытия клавиатуры конкретного поля. Настройте touchesBegan в UIViewController или используйте библиотеку IQKeyboardManager для автоматического управления клавиатурой. Не забудьте отключить cancelsTouchesInView для корректной работы кнопок.

Как изменить цвет текста и шрифт UITextField?

Цвет текста: textField.textColor = UIColor.label. Шрифт: textField.font = UIFont.systemFont(ofSize: 16, weight: .regular). Цвет placeholder: textField.attributedPlaceholder = NSAttributedString(string: "Email", attributes: [.foregroundColor: UIColor.secondaryLabel]).

Как сделать UITextField только для чтения?

Три способа: isEnabled = false (изменяет внешний вид), isUserInteractionEnabled = false (сохраняет визуальный стиль) или верните false в textFieldShouldBeginEditing делегата. Третий способ предпочтительнее — он блокирует ввод без изменения визуального стиля. Для программной установки текста в read-only режиме используйте делегат.

Итоги

  • UITextField — однострочное поле ввода UIKit с наследованием от UIControl и делегатным управлением
  • UIKeyboardType — 12 типов клавиатуры для разных сценариев: email, URL, numberPad, phonePad
  • UITextFieldDelegate — протокол с методами shouldBegin/End/Change/Return для управления вводом
  • Secure Text Entry — режим пароля через isSecureTextEntry с заменой символов на дужки
  • Left/Right View — кастомные элементы внутри поля (иконки, кнопки) с режимами always/whileEditing
  • Return Key Type — настройка кнопки Return: Next, Done, Search, Send для навигации по форме
  • Валидация — через shouldChangeCharactersInRange с regex и визуальной обратной связью через границу
  • Placeholder настраивается через attributedPlaceholder с NSAttributedString для кастомного стиля

Мы разработаем мобильное приложение под ключ

IT Sectr создаёт приложения для iOS и Android для стартапов и бизнеса с 2017 года. Мы проконсультируем вас и предложим наилучшее решение.

Обсудить проект

Читайте также