First Responderとは何か、目的と入力オブジェクト

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

First Responderとは、iOSにおいてタッチイベント、キー押下、シェイクジェスチャー、メニューコマンドを最初に受け取るUIResponderオブジェクトです。常に、アプリケーション内で1つのオブジェクトだけがfirst responderになることができます。割り当ては自動的に(UITextFieldがフォーカスを受け取ったとき)またはbecomeFirstResponderメソッドを介してプログラム的に行われます。Apple Developer Documentation (2026)によると、オブジェクトはcanBecomeFirstResponderメソッドがtrueを返す場合にのみfirst responderになることができ、このメカニズムを明示的かつ制御可能にしています。

重要なポイント

  • First Responderは入力イベントの主要な受信者であり、自動的またはbecomeFirstResponderを介して割り当てられます。
  • 1つのオブジェクトのみが特定の時点でfirst responderになることができます。
  • canBecomeFirstResponderはオブジェクトがfirst responderになるためにtrueを返す必要があります。
  • ResignFirstResponderはfirst responderステータスを削除し、UITextFieldのキーボードを非表示にします。
  • UITextFieldとUITextViewはユーザーからフォーカスを受け取るとfirst responderになります。

First Responderとは

First Responderとは、iOSアプリケーションで現在入力イベントを受け取っているUIResponderオブジェクトです。システムはすべてのタッチイベント、キー押下、モーションイベント(デバイスのシェイク)、アクションメッセージ(コンテキストメニューの呼び出しなど)をこのオブジェクトに送ります。

First Responderの概念はResponder Chainの最初のリンクです。first responderが受け取ったイベントを処理しない場合、そのイベントは自動的にチェーン内の次のオブジェクトに渡されます。これにより、イベントが失われることなく、階層内のすべての潜在的なハンドラーに順次提供されることが保証されます。

Appleによると、first responderステータスはUIResponderとそのcanBecomeFirstResponderおよびbecomeFirstResponderメソッドに密接に関連しています。デフォルトでは、UIViewは特定のサブクラス(UITextField、UITextView、UISearchBar)に対してのみtrueを返します。通常のUIViewを含むその他のビューはfalseを返し、誤った割り当てを防ぎます。

First Responderの割り当て方法

割り当ては2つの方法で行われます:ユーザーがUITextFieldにタッチしたとき(システムが内部でbecomeFirstResponderを呼び出す)の自動的な方法と、開発者が任意のUIResponderオブジェクトでbecomeFirstResponderメソッドを明示的に呼び出すプログラム的な方法です。

割り当ての前に、iOSはcanBecomeFirstResponderをチェックします。メソッドがfalseを返す場合、becomeFirstResponderの呼び出しは無視され、オブジェクトはfirst responderになりません。これは、イベントを処理する準備ができていないオブジェクト(非表示または無効化されたインターフェース要素など)の割り当てを防ぐ保護メカニズムです。

swift
class CustomTextField: UITextField {
    override var canBecomeFirstResponder: Bool {
        return super.canBecomeFirstResponder
    }
}

// プログラム的な割り当て
textField.becomeFirstResponder()

// First responderかどうか確認
if textField.isFirstResponder {
    print("TextFieldがfirst responderになりました")
}

新しいfirst responderが割り当てられると、iOSは自動的に前のオブジェクトでresignFirstResponderを呼び出します。これにより、システム内で常に1つのオブジェクトだけがfirst responderステータスを持つことが保証されます。新しいオブジェクトがfirst responderになれない場合(canBecomeFirstResponder = false)、古いオブジェクトがそのステータスを保持します。

First Responderとキーボード

iOSキーボードは、first responderメカニズムによって画面に表示されます。UITextFieldまたはUITextViewがfirst responderになると、システムは自動的にそのフィールドの現在のkeyboardTypeに関連付けられたキーボードを表示します。first responderがresignすると、キーボードは非表示になります。

この動作はiOSにおける重要なUXメカニズムです:ユーザーが入力フィールドにタッチするとキーボードが表示され、Returnを押すか別のフィールドにタッチするとキーボードが切り替わるか非表示になります。開発者はUIResponderメソッド、およびinputViewとinputAccessoryViewを介して標準キーボードをカスタムのものに置き換えることで、これを制御できます。

Input Accessory Viewはキーボードの上にある追加パネルで、first responderにも関連付けられています。例えば、入力フィールド間を移動するためのNext、Previous、Doneボタンを備えたパネルです。キーボードと一緒に表示・非表示になり、first responderステータスと同期します。

イベントFirst Responderステータスキーボード
UITextFieldにタッチFirst responderになる表示
Returnを押すそのまままたはresignそのまままたは非表示
別のフィールドにタッチ新しいフィールドに移動切り替え
resignFirstResponderを呼び出す削除非表示
アプリが非表示に自動的にresign非表示

Resign First Responder

ResignFirstResponderは、オブジェクトからfirst responderステータスを削除するUIResponderメソッドです。呼び出し後、オブジェクトは入力イベントの受信を停止し、キーボード(アクティブだった場合)は非表示になります。メソッドはBoolを返します — resignが成功した場合はtrueです。

開発者は、Doneボタンの押下、画面の空き領域へのタッチ(view.endEditing)、または画面から離れる際にresignFirstResponderを呼び出すことがよくあります。view.endEditing(true)は、すべての子テキストフィールドを一度にresignする便利な方法です:ビュー階層全体を走査し、現在のfirst responderでresignFirstResponderを呼び出します。

swift
// Doneボタンタップでresign
@objc func doneButtonTapped() {
    textField.resignFirstResponder()
}

// 空いた領域のタップでresign
override func touchesBegan(
    _ touches: Set<UITouch>,
    with event: UIEvent?
) {
    view.endEditing(true)
}

// すべてのフォームフィールドでresign
func validateAndSubmit() {
    view.endEditing(true)
    // フォーム送信ロジック
}

resignFirstResponderがfalseを返す状況があります。これは、オブジェクトがメソッドをオーバーライドし、ステータスの削除を明示的に禁止した場合に発生します。例えば、検証処理中のテキストフィールドがデータ損失を防ぐために一時的にresignをブロックすることがあります。そのような場合、検証が完了するのを待ってから強制的にresignしてください。

First Responderの確認と監視

UIResponderはisFirstResponderプロパティ(読み取り専用)を提供し、指定されたオブジェクトが現在first responderである場合にtrueを返します。これは条件付きロジックに便利です — 例えば、テキストフィールドにフォーカスがありユーザーがデータを入力している場合にアクションを実行しないようにするためです。

iOSはアプリケーション全体で現在のfirst responderを取得するための組み込みAPIを提供していません。開発者はUIResponderメソッドを使用してビュー階層を走査することでこれを実現します。Appleはfirst responderへのweak referenceを推奨しており、KVOまたはデリゲートを介して更新できます。

swift
// First responderを見つける拡張
extension UIView {
    var firstResponder: UIResponder? {
        guard isFirstResponder else {
            return subviews.compactMap { $0.firstResponder }.first
        }
        return self
    }
}

// 使い方
if let current = view.firstResponder {
    print("Current first responder: \(current)")
}

変更の追跡には、UIResponder.keyboardWillShowNotificationおよびUIResponder.keyboardWillHideNotificationにサブスクライブできます — これらは、何らかのテキストオブジェクトがfirst responderになったり、その状態でなくなったことを間接的に示します。ただし、isFirstResponderの変更に対する直接のサブスクリプションは存在せず、KVOまたはカスタムデリゲートが使用されます。

First Responderとカスタムビュー

カスタムビューは、canBecomeFirstResponderをオーバーライドしてtrueを返すことでfirst responderになることができます。これは、キーボードや物理ボタンのイベントを受け取る必要があるコンポーネント(カスタムゲームコントローラーやUITextViewベースのコードエディターなど)に必要です。

カスタムfirst responderを作成する際は、アクセシビリティを考慮することが重要です:VoiceOverとSwitch Controlはナビゲーションのために正しいfirst responderの割り当てに依存しています。カスタムビューがfirst responderになる場合、UIAccessibilityプロトコルを正しく実装し、支援技術にそのステータスを報告する必要があります。

カスタム入力(バーコードスキャナーやデジタルキーパッドなど)の場合、inputViewプロパティをオーバーライドします — このビューがfirst responderのときに標準キーボードの代わりに表示されるカスタムUIViewを返します。同様に、inputAccessoryViewはキーボードの上にパネルを追加します。

よくある質問

iOSのFirst Responderとは何ですか?

First Responderは、現在入力イベント(タッチ、キー、加速度計)を受け取っているUIResponderオブジェクトです。becomeFirstResponderを介して割り当てられ、canBecomeFirstResponderからtrueを返す必要があります。アプリケーション内で1つのオブジェクトのみがfirst responderになることができます。

タッチせずにUITextFieldをfirst responderにするには?

textField.becomeFirstResponder()をプログラム的に呼び出します(例:viewDidAppear内)。textFieldが非表示でないこと、userInteractionEnabled = true、isEnabled = trueであることを確認してください。フィールドがUITableViewまたはUICollectionView内にある場合、セルが画面に表示されていることを確認してください。

テキストフィールド外をタップしてキーボードを非表示にするには?

メインビューにUITapGestureRecognizerを追加し、そのハンドラーでview.endEditing(true)を呼び出します。これにより、現在のfirst responderが自動的に見つかり、resignFirstResponderが呼び出されます。または、UIViewControllerでtouchesBeganをオーバーライドしてendEditingを呼び出します。

becomeFirstResponderがfalseを返すのはなぜですか?

becomeFirstResponderは、canBecomeFirstResponderがfalseを返す場合、ビューが非表示の場合、ウィンドウ階層にない場合、またはuserInteractionEnabled = falseの場合にfalseを返します。また、ビューがウィンドウに追加されていることを確認してください — 画面に表示されていないビューはbecomeFirstResponderに応答しません。

現在どのオブジェクトがfirst responderかを判断するには?

iOSはこれに対するグローバルAPIを提供していません。各サブビューでisFirstResponderをチェックするUIView拡張を使用して、ビュー階層の再帰的走査を行います。代替方法として、AppDelegateに最後のfirst responderへのweak referenceを保存し、UITextFieldデリゲートを介して更新します。

まとめ

  • First Responderは、iOSで入力イベントを受け取る唯一のUIResponderオブジェクトです。Responder Chainの最初のリンクです。
  • becomeFirstResponderはオブジェクトをfirst responderとして割り当てますが、canBecomeFirstResponderがtrueを返す場合のみです — これはシステムの明示的な保護メカニズムです。
  • resignFirstResponderはfirst responderステータスを削除します。テキストフィールドの場合、自動的にキーボードを非表示にします。
  • UITextFieldとUITextViewはフォーカスを受け取るとfirst responderになり、別のフィールドでbecomeFirstResponderを介してプログラム的に変更できます。
  • view.endEditing(true)は、ビュー階層内のすべての子レスポンダーオブジェクトをresignする便利な方法です。
  • カスタムビューは、特定の入力シナリオのためにcanBecomeFirstResponderをオーバーライドすることでfirst responderになることができます。
  • First Responderの追跡は、再帰的なサブビュー走査またはキーボード通知を介して間接的に実装されます。

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

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

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

こちらもお読みください