UITextFieldは、iOSで単一行のテキスト入力を行うための標準的なUIKitコンポーネントであり、UIControlを継承し、幅広いキーボードモードをサポートしています。Apple Developerのドキュメント(2025年)によると、UITextFieldはshouldBeginEditing、shouldChangeCharactersInRange、shouldReturnのコールバックを持つUITextFieldDelegateを提供します。UITextViewとは異なり、UITextFieldは入力を1行に制限し、secureTextEntry、leftView、rightViewによるカスタムコントロールをサポートします。これはiOSアプリケーションにおいて、認証フォーム、検索、登録、データ入力のための主要な要素です。
主要ポイント
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。
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 |
| numberPad | PIN、コード | 数字0-9のみ |
| emailAddress | メール | メインレイヤーに@と. |
| URL | ウェブアドレス | メインに.com、/、. |
| phonePad | 電話 | 数字、+、*、# |
| decimalPad | 価格、数値 | 数字 + 小数点 |
UITextFieldDelegateは、入力のさまざまな段階でテキストフィールドの動作を定義するプロトコルです。主なメソッド:textFieldShouldBeginEditing(textField) — 編集の開始を許可または拒否するBoolを返します;textFieldDidBeginEditing — キーボードが表示された後に呼ばれます;textFieldShouldEndEditing — 編集を完了できるかどうかをチェックします(falseの場合、フィールドはフォーカスを失いません);textFieldDidEndEditing — キーボードが非表示になった後に呼ばれます;textFieldShouldChangeCharactersInRange — 各文字の入力時に呼ばれ、入力をフィルタリングできます(1文字のみ許可、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ビューはパディングを考慮してテキストフィールド内に自動的に配置されます。ビューのサイズは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) — 最初の文字の自動大文字化;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はキーボードのボタンテキストを定義します: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を使用します。
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)。スムーズな遷移のために、フィールドのボーダーはアニメーションブロックを介して更新されます。
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を返します。代替方法:addTargetを介してeditingChangedイベントに購読し、textField.text = String(text.prefix(maxLength)) を使用してテキストを切り詰めます。
確認事項:isUserInteractionEnabled = true(デフォルト)、デリゲートがshouldBeginEditingでfalseを返していないこと。フィールドがUIScrollView内にある場合は、delaysContentTouchesを無効にします。フィールドがモーダルコントローラー内にある場合は、タッチをブロックしていないか確認します。SwiftUI UIViewRepresentableの場合、DispatchQueue.main.asyncを介してフィールドが正しくfirstResponderになっているか確認します。
self.viewまたはscrollViewに UITapGestureRecognizer を追加し、view.endEditing(true) を呼び出すtarget-actionを設定します。代替方法:特定のフィールドのキーボードを閉じるには textField.resignFirstResponder()。UIViewControllerでtouchesBeganを実装するか、IQKeyboardManagerライブラリを使用して自動キーボード管理を行います。ボタンの正しい動作のためにcancelsTouchesInViewを無効にすることを忘れないでください。
テキストの色:textField.textColor = UIColor.label。フォント:textField.font = UIFont.systemFont(ofSize: 16, weight: .regular)。 プレースホルダーの色:textField.attributedPlaceholder = NSAttributedString(string: "Email", attributes: [.foregroundColor: UIColor.secondaryLabel])。
3つの方法:isEnabled = false(外観が変わります)、isUserInteractionEnabled = false(視覚スタイルを維持)、またはtextFieldShouldBeginEditingデリゲートでfalseを返す。3番目の方法が推奨されます — 視覚スタイルを変更せずに入力をブロックします。読み取り専用モードでプログラム的にテキストを設定するには、デリゲートを使用します。
まとめ
ターンキー方式のモバイルアプリケーションを開発します
IT Sectrは2017年からスタートアップや企業向けにiOS・Androidアプリケーションを開発しています。私たちがご相談に乗り、最適なソリューションをご提案します。