【Swift】.focusedとは?意味や使い方、活用シーンをわかりやすく解説!

SwiftUIでテキストフィールドなどのフォーカス状態(入力中かどうか)を操作する際に使われるのが .focused() というビュー修飾子です。

@FocusState と組み合わせることで、どのViewにフォーカスを当てるか/外すかをプログラム的に制御できるようになります。

この記事では .focused() の基本的な意味や使い方、引数のオプション、注意点までをわかりやすく丁寧に解説します。

.focused とは?

.focused() は、SwiftUIのViewに対して「どの要素がフォーカスされているか」を指定するための修飾子です。

具体的には、TextFieldやSecureFieldなど、キーボード入力を受け付けるUIコンポーネントに対して使用され、フォーカス(=キーボード表示状態)をプログラムで制御できるようにします。

この .focused() 修飾子は、SwiftUIの View プロトコルの拡張として提供されており、任意のViewに適用できます。

つまり、.focused() はView(構造体)を拡張して使えるようになっている修飾子のひとつです。

引数のオプション

.focused() にはいくつかの指定方法があり、用途に応じて使い分けられます。

  1. focused(_:)
    • Bool 型の @FocusState と組み合わせて使います。
    • 単一のフィールドにフォーカスがあるかどうかをシンプルに管理できます。
  2. focused(_:equals:)
    • Hashable に準拠した Enum などと組み合わせて使います。
    • 複数のフィールドのどれにフォーカスが当たっているかを明示的に制御できます。

このように、シンプルに「あるかないか」で管理したい場合は Bool

複数フィールドを切り替えたい場合は Enum と、状況に応じて使い分けられるのが .focused() の柔軟さです。

具体例

具体例①:TextFieldにBoolでフォーカス制御を行う

このように .focused($isFocused) を使うことで、「今このTextFieldにフォーカスがあるかどうか」を isFocused という状態変数で双方向に管理できます。

具体例②:列挙型と一緒に使って複数フィールドを切り替える

このように .focused(_:equals:) を使うことで、複数のTextField間でフォーカスを切り替えることができます。

内部的には、focusedField.email.password のどちらかの値を持つことで、どのフィールドが現在アクティブかを制御しています。

.focused の活用シーン

.focused() は、単なるキーボード表示制御だけでなく、ユーザーの操作フローを自然に導くために利用できるのが大きな特徴です。

特に複数の入力欄を持つ画面やログインフォームなどでは、ユーザーの手間を減らしてスムーズな体験を提供できます。

  • ボタンを押したときに任意のフィールドへフォーカスを移動させたいとき
  • 初期表示時に自動でキーボードを開きたいとき
  • 入力後、次のフィールドへ自動で遷移させたいとき
  • フォーカスの状態に応じてViewの見た目(色・枠線など)を変えたいとき

このように、フォームや検索画面などで「入力の流れを作る」際に .focused() は非常に役立ちます。

開発者が明示的に制御することで、ユーザーは迷うことなく次の操作へ進めるようになります。

.focused の注意点

便利に見える .focused() ですが、正しく動作させるためにはいくつかの前提や制約があります。

特に @FocusState との組み合わせや、複数フィールドでの利用時には注意が必要です。

  • .focused() を使うには、事前に @FocusState プロパティラッパーを定義しておく必要があります
  • 複数フィールドの制御には Hashable に準拠した列挙型が便利ですが、タグを指定し忘れると切り替えが正しく動作しません
  • ScrollViewForm 内で使う場合は、キーボードとの干渉に注意(スクロール補正が必要なケースもあり)

これらの点を理解して設計すれば、.focused() を安定して活用でき、入力体験を壊さずに柔軟な制御が可能になります。

まとめ

今回は SwiftUI の .focused() 修飾子について詳しく紹介しました。

  • .focused() は、SwiftUIのView拡張として提供されるフォーカス制御用の修飾子
  • @FocusState と組み合わせて、TextFieldなどの入力状態を制御できる
  • Bool型やEnum型のバインディングを使って、柔軟な制御が可能
  • 入力フォームのUX向上や入力ステップの管理に非常に役立つ

.focused() は、ユーザー入力をよりスムーズかつ柔軟に扱うために欠かせない機能です。

まずは1つのTextFieldから試し、複数入力欄での自動フォーカス移動にも挑戦してみましょう。

おすすめの記事