First Responderとは、iOSにおいてタッチイベント、キー押下、シェイクジェスチャー、メニューコマンドを最初に受け取るUIResponderオブジェクトです。常に、アプリケーション内で1つのオブジェクトだけがfirst responderになることができます。割り当ては自動的に(UITextFieldがフォーカスを受け取ったとき)またはbecomeFirstResponderメソッドを介してプログラム的に行われます。Apple Developer Documentation (2026)によると、オブジェクトはcanBecomeFirstResponderメソッドがtrueを返す場合にのみ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を返し、誤った割り当てを防ぎます。
割り当ては2つの方法で行われます:ユーザーがUITextFieldにタッチしたとき(システムが内部でbecomeFirstResponderを呼び出す)の自動的な方法と、開発者が任意のUIResponderオブジェクトでbecomeFirstResponderメソッドを明示的に呼び出すプログラム的な方法です。
割り当ての前に、iOSはcanBecomeFirstResponderをチェックします。メソッドがfalseを返す場合、becomeFirstResponderの呼び出しは無視され、オブジェクトはfirst responderになりません。これは、イベントを処理する準備ができていないオブジェクト(非表示または無効化されたインターフェース要素など)の割り当てを防ぐ保護メカニズムです。
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)、古いオブジェクトがそのステータスを保持します。
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 | 非表示 |
ResignFirstResponderは、オブジェクトからfirst responderステータスを削除するUIResponderメソッドです。呼び出し後、オブジェクトは入力イベントの受信を停止し、キーボード(アクティブだった場合)は非表示になります。メソッドはBoolを返します — resignが成功した場合はtrueです。
開発者は、Doneボタンの押下、画面の空き領域へのタッチ(view.endEditing)、または画面から離れる際にresignFirstResponderを呼び出すことがよくあります。view.endEditing(true)は、すべての子テキストフィールドを一度にresignする便利な方法です:ビュー階層全体を走査し、現在のfirst responderでresignFirstResponderを呼び出します。
// 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してください。
UIResponderはisFirstResponderプロパティ(読み取り専用)を提供し、指定されたオブジェクトが現在first responderである場合にtrueを返します。これは条件付きロジックに便利です — 例えば、テキストフィールドにフォーカスがありユーザーがデータを入力している場合にアクションを実行しないようにするためです。
iOSはアプリケーション全体で現在のfirst responderを取得するための組み込みAPIを提供していません。開発者はUIResponderメソッドを使用してビュー階層を走査することでこれを実現します。Appleはfirst responderへのweak referenceを推奨しており、KVOまたはデリゲートを介して更新できます。
// 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またはカスタムデリゲートが使用されます。
カスタムビューは、canBecomeFirstResponderをオーバーライドしてtrueを返すことでfirst responderになることができます。これは、キーボードや物理ボタンのイベントを受け取る必要があるコンポーネント(カスタムゲームコントローラーやUITextViewベースのコードエディターなど)に必要です。
カスタムfirst responderを作成する際は、アクセシビリティを考慮することが重要です:VoiceOverとSwitch Controlはナビゲーションのために正しいfirst responderの割り当てに依存しています。カスタムビューがfirst responderになる場合、UIAccessibilityプロトコルを正しく実装し、支援技術にそのステータスを報告する必要があります。
カスタム入力(バーコードスキャナーやデジタルキーパッドなど)の場合、inputViewプロパティをオーバーライドします — このビューがfirst responderのときに標準キーボードの代わりに表示されるカスタムUIViewを返します。同様に、inputAccessoryViewはキーボードの上にパネルを追加します。
よくある質問
First Responderは、現在入力イベント(タッチ、キー、加速度計)を受け取っているUIResponderオブジェクトです。becomeFirstResponderを介して割り当てられ、canBecomeFirstResponderからtrueを返す必要があります。アプリケーション内で1つのオブジェクトのみがfirst responderになることができます。
textField.becomeFirstResponder()をプログラム的に呼び出します(例:viewDidAppear内)。textFieldが非表示でないこと、userInteractionEnabled = true、isEnabled = trueであることを確認してください。フィールドがUITableViewまたはUICollectionView内にある場合、セルが画面に表示されていることを確認してください。
メインビューにUITapGestureRecognizerを追加し、そのハンドラーでview.endEditing(true)を呼び出します。これにより、現在のfirst responderが自動的に見つかり、resignFirstResponderが呼び出されます。または、UIViewControllerでtouchesBeganをオーバーライドしてendEditingを呼び出します。
becomeFirstResponderは、canBecomeFirstResponderがfalseを返す場合、ビューが非表示の場合、ウィンドウ階層にない場合、またはuserInteractionEnabled = falseの場合にfalseを返します。また、ビューがウィンドウに追加されていることを確認してください — 画面に表示されていないビューはbecomeFirstResponderに応答しません。
iOSはこれに対するグローバルAPIを提供していません。各サブビューでisFirstResponderをチェックするUIView拡張を使用して、ビュー階層の再帰的走査を行います。代替方法として、AppDelegateに最後のfirst responderへのweak referenceを保存し、UITextFieldデリゲートを介して更新します。
まとめ
ターンキー方式のモバイルアプリケーションを開発します
IT Sectrは2017年からスタートアップや企業向けにiOS・Androidアプリケーションを開発しています。私たちがご相談に乗り、最適なソリューションをご提案します。