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), текст-плейсхолдер, коли поле порожнє, кнопку очищення (clearButtonMode) та може містити ліву/праву допоміжні view. Поле автоматично показує/ховує клавіатуру при отриманні/втраті фокусу через becomeFirstResponder та resignFirstResponder. Розмір поля визначається intrinsicContentSize на основі шрифту та стилю рамки. Для створення 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. При перемиканні між захищеним режимом та звичайним текстом (show/hide password) встановіть textField.isSecureTextEntry.toggle(). Важливо: при зміні isSecureTextEntry текст поля скидається — збережіть його заздалегідь. LeftView та RightView — це кастомні UIView, що відображаються всередині поля введення зліва або справа. Типове використання: іконка пошуку в leftView, кнопка "Очистити" в rightView. Налаштування: textField.leftViewMode = always (завжди) або whileEditing (лише під час редагування). Left/right view автоматично позиціонуються всередині текстового поля з урахуванням відступів. Розмір 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

        // Користувацька кнопка показати/сховати пароль
        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

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 {
        // Блокувати пробіли в 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 з регулярним виразом

Валідація email виконується через NSPredicate з форматом "SELF MATCHES %@" та регулярним виразом для базової перевірки формату. Реальна перевірка існування email повинна виконуватися на сервері. Для розширеної валідації використовуйте бібліотеку 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 делегата. Третій спосіб кращий — він блокує введення без зміни візуального стилю. Для програмного встановлення тексту в режимі лише читання використовуйте делегат.

Підсумки

  • 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 року. Ми проконсультуємо вас і запропонуємо найкраще рішення.

Обговорити проект

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