SwiftUIで、TextField
やTextEditor
など、編集可能なビューがある画面を表示する際に、自動的にキーボードを表示してすぐに入力できるようにする方法を調べたので、この記事にまとめました。
フォーカス状態を設定・取得する
TextField
やTextEditor
のフォーカス状態を設定および取得するには、@FocusState
というプロパティラッパーとfocused
モディファイアを使用します。
以下のコードではisFocused
プロパティにTextField
のフォーカス状態が代入されます。
import SwiftUI
struct ContentView: View {
@State private var text: String = ""
@FocusState private var isFocused: Bool
var body: some View {
TextField("", text: $text)
.padding()
.textFieldStyle(.roundedBorder)
.focused($isFocused)
}
}
ビュー表示時にフォーカス状態を設定する
isFocused
プロパティはフォーカス状態の取得だけでなく、フォーカス状態の変更も可能です。キーボードはフォーカス状態のときに表示されます。画面が表示される際にisFocused
プロパティをtrue
に設定することで、画面表示と同時に自動的にキーボードを表示させることができます。
import SwiftUI
struct ContentView: View {
@State private var text: String = ""
@FocusState private var isFocused: Bool
var body: some View {
TextField("", text: $text)
.padding()
.textFieldStyle(.roundedBorder)
.focused($isFocused)
.onAppear() {
DispatchQueue.main.async {
isFocused = true
}
}
}
}
Dispatchで遅延させる
onAppear
の中で直接isFocused
プロパティにtrue
を設定すると、キーボードが表示された際に反応しないことがありました。おそらくビューの構築処理中にフォーカスが変更され、キーボードの表示によって再構築が必要になるためだと思われます。
そのため、DispatchQueue
のasync
メソッドを使用してビューの構築処理の外でプロパティを設定するようにしています。
実行
このコードを実行すると、ContentView
が表示される際にキーボードが自動的に表示されます。