UITextField — 概要、入力フィールドの設定と動作原理

著者: IT Sectr 公開日: 2026-07-06 読了時間: 8 分

UITextFieldは、iOSで単一行のテキスト入力を行うための標準的なUIKitコンポーネントであり、UIControlを継承し、幅広いキーボードモードをサポートしています。Apple Developerのドキュメント(2025年)によると、UITextFieldはshouldBeginEditing、shouldChangeCharactersInRange、shouldReturnのコールバックを持つUITextFieldDelegateを提供します。UITextViewとは異なり、UITextFieldは入力を1行に制限し、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)を表示し、左/右の補助ビューを含めることができます。フィールドはbecomeFirstResponderとresignFirstResponderを介してフォーカスを取得/喪失すると、自動的にキーボードを表示/非表示にします。フィールドサイズは、フォントとボーダースタイルに基づいてintrinsicContentSizeによって決定されます。Interface Builder(Storyboard/XIB)でUITextFieldを作成するには、Object Libraryを使用します。プログラムで作成するには、イニシャライザ UITextField(frame: CGRect) を使用します。このクラスは最新のiOSアーキテクチャと完全に互換性があります:Combineパブリッシャー、UIViewRepresentableを介したSwiftUIでの@Published、フォーム用のDiffable Data Source。

UIKeyboardTypeのキーボードタイプ

UITextFieldは、keyboardTypeプロパティを介して12種類のキーボードタイプをサポートしています。各タイプは、特定の入力シナリオに合わせて文字セットを最適化します。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のみ
emailAddressメールメインレイヤーに@と.
URLウェブアドレスメインに.com、/、.
phonePad電話数字、+、*、#
decimalPad価格、数値数字 + 小数点

UITextFieldDelegateとそのメソッド

UITextFieldDelegateは、入力のさまざまな段階でテキストフィールドの動作を定義するプロトコルです。主なメソッド:textFieldShouldBeginEditing(textField) — 編集の開始を許可または拒否するBoolを返します;textFieldDidBeginEditing — キーボードが表示された後に呼ばれます;textFieldShouldEndEditing — 編集を完了できるかどうかをチェックします(falseの場合、フィールドはフォーカスを失いません);textFieldDidEndEditing — キーボードが非表示になった後に呼ばれます;textFieldShouldChangeCharactersInRange — 各文字の入力時に呼ばれ、入力をフィルタリングできます(1文字のみ許可、falseを返すと文字は追加されません);textFieldShouldReturn — Return/Go/Next/Searchが押されたときに呼ばれ、次のフィールドに移動するために使用されます。デリゲートはOptionalではありません:すべてのメソッドにデフォルトの実装がありますが、カスタム動作には対応するメソッドをオーバーライドする必要があります。

shouldReturnによるフォーカス管理

shouldReturnメソッドは、フォームフィールド間を移動するための標準的なパターンです。実装:textFieldShouldReturn(textField) — どのtextFieldがイベントをトリガーしたかを確認し、becomeFirstResponder() を介して次のフィールドにフォーカスを移動します。最後のフィールドの場合は、resignFirstResponder() を呼び出してキーボードを非表示にします。フィールド参照を保存するには、IBOutlet collectionまたは各フィールドに個別のIBOutletを使用します。

Secure Text Entryとカスタムleft/rightビュー

isSecureTextEntry — UITextFieldのプロパティで、trueの場合、入力文字を黒丸(•)に置き換え、UIMenuControllerを介したテキストコピーをブロックします。パスワードフィールド、PINコード、CVVに使用されます。セキュアモードとプレーンテキスト(show/hide password)を切り替える際は、textField.isSecureTextEntry.toggle() を設定します。重要:isSecureTextEntryを変更するとフィールドのテキストがリセットされるため、事前に保存してください。LeftViewRightViewは、入力フィールドの左側または右側に表示されるカスタムUIViewです。典型的な使用例:leftViewに検索アイコン、rightViewに「クリア」ボタン。設定:textField.leftViewMode = always(常に)またはwhileEditing(編集中のみ)。left/rightビューはパディングを考慮してテキストフィールド内に自動的に配置されます。ビューのサイズは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) — 最初の文字の自動大文字化;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とフォームナビゲーション

Return Key Typeはキーボードのボタンテキストを定義します:Next — 次のフィールドへ、Done — 入力を完了、Search — 検索を開始、Send — フォームを送信、Continue — 入力を継続。shouldReturnデリゲートメソッドと組み合わせることで、returnKeyTypeは自然なUXを実現します:ユーザーはフィールドを入力し、Nextを押して次へ進み、最後のフィールドでDoneを押して送信します。ボタンテキストのカスタマイズには、iOS 15+でUIButtonConfigurationを使用します。

プレースホルダー、フォーマット、入力マスク

UITextFieldのプレースホルダーは、フィールドが空のときに灰色で表示されるテキストです。設定:textField.placeholder = "Enter email"。プレースホルダーの色とフォントをカスタマイズするには、NSAttributedStringとともにattributedPlaceholderを使用します。入力マスクはデリゲートメソッドshouldChangeCharactersInRangeを介して実装され、電話番号、日付、クレジットカード、SNILS形式をサポートします。入力マスクを使用すると、表示と値を分離できます:ユーザーはフォーマットされたテキスト(例:+7 (999) 999-99-99)を見て、モデルは「79999999999」を保存します。実装例:マスクを置き換え用のX文字を含む文字列として保存します。入力のたびにフォーマットされた文字列を生成し、shouldChangeCharactersInRangeでfalseを返し、textField.text = formattedText を介してフィールドテキストを置き換えます。数値にはNumberFormatterとdecimal 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 {
        // メールのスペースをブロック
        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を使用したログインフォームの完全な実装例を見てみましょう。メールバリデーションと視覚的なフィードバックも含みます。フォームには2つのフィールドがあります:emailField(emailAddressキーボード、自動修正なし)とpasswordField(secureTextEntry)。バリデーションはshouldChangeCharactersInRangeで実行され、さらにLoginボタンが押されたときにも実行されます。視覚的なフィードバック:エラー時は赤いボーダー(layer.borderColor)、成功時は緑色。textFieldDidBeginEditingで編集中にボーダーをリセットします。

正規表現によるメールバリデーション

メールバリデーションは、形式 "SELF MATCHES %@" のNSPredicateと基本的な形式チェックのための正規表現を使用して実行されます。実際のメール存在確認はサーバー側で行う必要があります。高度なバリデーションには、SwiftValidatorsライブラリまたはCombineパブリッシャーを使用します。例:NSPredicate(format: "SELF MATCHES [c] %@", emailRegex).evaluate(with: email)。スムーズな遷移のために、フィールドのボーダーはアニメーションブロックを介して更新されます。

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を返します。代替方法:addTargetを介してeditingChangedイベントに購読し、textField.text = String(text.prefix(maxLength)) を使用してテキストを切り詰めます。

UITextFieldがタップに反応しないのはなぜ?

確認事項:isUserInteractionEnabled = true(デフォルト)、デリゲートがshouldBeginEditingでfalseを返していないこと。フィールドがUIScrollView内にある場合は、delaysContentTouchesを無効にします。フィールドがモーダルコントローラー内にある場合は、タッチをブロックしていないか確認します。SwiftUI UIViewRepresentableの場合、DispatchQueue.main.asyncを介してフィールドが正しくfirstResponderになっているか確認します。

UITextField外をタップしてキーボードを閉じるには?

self.viewまたはscrollViewに UITapGestureRecognizer を追加し、view.endEditing(true) を呼び出すtarget-actionを設定します。代替方法:特定のフィールドのキーボードを閉じるには textField.resignFirstResponder()。UIViewControllerでtouchesBeganを実装するか、IQKeyboardManagerライブラリを使用して自動キーボード管理を行います。ボタンの正しい動作のためにcancelsTouchesInViewを無効にすることを忘れないでください。

UITextFieldのテキストの色とフォントを変更するには?

テキストの色textField.textColor = UIColor.labelフォントtextField.font = UIFont.systemFont(ofSize: 16, weight: .regular)。 プレースホルダーの色textField.attributedPlaceholder = NSAttributedString(string: "Email", attributes: [.foregroundColor: UIColor.secondaryLabel])。

UITextFieldを読み取り専用にするには?

3つの方法:isEnabled = false(外観が変わります)、isUserInteractionEnabled = false(視覚スタイルを維持)、またはtextFieldShouldBeginEditingデリゲートでfalseを返す。3番目の方法が推奨されます — 視覚スタイルを変更せずに入力をブロックします。読み取り専用モードでプログラム的にテキストを設定するには、デリゲートを使用します。

まとめ

  • UITextField — UIControlを継承し、デリゲート管理を備えた単一行UIKit入力フィールド
  • 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と正規表現による、ボーダーを通じた視覚的フィードバック
  • プレースホルダーはカスタムスタイルのためにNSAttributedStringと共にattributedPlaceholderを介して設定されます

ターンキー方式のモバイルアプリケーションを開発します

IT Sectrは2017年からスタートアップや企業向けにiOS・Androidアプリケーションを開発しています。私たちがご相談に乗り、最適なソリューションをご提案します。

プロジェクトについて相談

こちらもお読みください