SwiftUIでテキストフィールドなどのフォーカス状態(入力中かどうか)を操作する際に使われるのが .focused()
というビュー修飾子です。
@FocusState
と組み合わせることで、どのViewにフォーカスを当てるか/外すかをプログラム的に制御できるようになります。
この記事では .focused()
の基本的な意味や使い方、引数のオプション、注意点までをわかりやすく丁寧に解説します。
.focused とは?
.focused()
は、SwiftUIのViewに対して「どの要素がフォーカスされているか」を指定するための修飾子です。
具体的には、TextFieldやSecureFieldなど、キーボード入力を受け付けるUIコンポーネントに対して使用され、フォーカス(=キーボード表示状態)をプログラムで制御できるようにします。
この .focused()
修飾子は、SwiftUIの View
プロトコルの拡張として提供されており、任意のViewに適用できます。
1 2 3 4 |
extension View { func focused<Value>(_ binding: Binding<Value?>, equals value: Value) -> some View where Value : Hashable } |
つまり、.focused()
はView(構造体)を拡張して使えるようになっている修飾子のひとつです。
引数のオプション
.focused()
にはいくつかの指定方法があり、用途に応じて使い分けられます。
focused(_:)
Bool
型の@FocusState
と組み合わせて使います。- 単一のフィールドにフォーカスがあるかどうかをシンプルに管理できます。
123TextField("名前", text: $name).focused($isFocused)focused(_:equals:)
Hashable
に準拠したEnum
などと組み合わせて使います。- 複数のフィールドのどれにフォーカスが当たっているかを明示的に制御できます。
123TextField("メール", text: $email).focused($focusedField, equals: .email)
このように、シンプルに「あるかないか」で管理したい場合は Bool
。
複数フィールドを切り替えたい場合は Enum
と、状況に応じて使い分けられるのが .focused()
の柔軟さです。
具体例
具体例①:TextFieldにBoolでフォーカス制御を行う
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
struct ContentView: View { @State private var name = "" @FocusState private var isFocused: Bool var body: some View { VStack { TextField("名前を入力", text: $name) .focused($isFocused) Button("フォーカスを外す") { isFocused = false } } } } |
.focused($isFocused)
を使うことで、「今このTextFieldにフォーカスがあるかどうか」を isFocused
という状態変数で双方向に管理できます。
具体例②:列挙型と一緒に使って複数フィールドを切り替える
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
struct ContentView: View { enum Field: Hashable { case email case password } @State private var email = "" @State private var password = "" @FocusState private var focusedField: Field? var body: some View { VStack { TextField("メールアドレス", text: $email) .focused($focusedField, equals: .email) SecureField("パスワード", text: $password) .focused($focusedField, equals: .password) Button("次へ") { focusedField = .password } } .padding() } } |
.focused(_:equals:)
を使うことで、複数のTextField間でフォーカスを切り替えることができます。
内部的には、focusedField
が .email
か .password
のどちらかの値を持つことで、どのフィールドが現在アクティブかを制御しています。
.focused の活用シーン
.focused()
は、単なるキーボード表示制御だけでなく、ユーザーの操作フローを自然に導くために利用できるのが大きな特徴です。
特に複数の入力欄を持つ画面やログインフォームなどでは、ユーザーの手間を減らしてスムーズな体験を提供できます。
- ボタンを押したときに任意のフィールドへフォーカスを移動させたいとき
- 初期表示時に自動でキーボードを開きたいとき
- 入力後、次のフィールドへ自動で遷移させたいとき
- フォーカスの状態に応じてViewの見た目(色・枠線など)を変えたいとき
このように、フォームや検索画面などで「入力の流れを作る」際に .focused()
は非常に役立ちます。
開発者が明示的に制御することで、ユーザーは迷うことなく次の操作へ進めるようになります。
.focused の注意点
便利に見える .focused()
ですが、正しく動作させるためにはいくつかの前提や制約があります。
特に @FocusState
との組み合わせや、複数フィールドでの利用時には注意が必要です。
.focused()
を使うには、事前に@FocusState
プロパティラッパーを定義しておく必要があります- 複数フィールドの制御には
Hashable
に準拠した列挙型が便利ですが、タグを指定し忘れると切り替えが正しく動作しません ScrollView
やForm
内で使う場合は、キーボードとの干渉に注意(スクロール補正が必要なケースもあり)
これらの点を理解して設計すれば、.focused()
を安定して活用でき、入力体験を壊さずに柔軟な制御が可能になります。
まとめ
今回は SwiftUI の .focused()
修飾子について詳しく紹介しました。
.focused()
は、SwiftUIのView拡張として提供されるフォーカス制御用の修飾子@FocusState
と組み合わせて、TextFieldなどの入力状態を制御できる- Bool型やEnum型のバインディングを使って、柔軟な制御が可能
- 入力フォームのUX向上や入力ステップの管理に非常に役立つ
.focused()
は、ユーザー入力をよりスムーズかつ柔軟に扱うために欠かせない機能です。
まずは1つのTextFieldから試し、複数入力欄での自動フォーカス移動にも挑戦してみましょう。