1. ホーム
  2. swift

[解決済み] SwiftUI。TextFieldをファーストレスポンダーにするには?

2022-07-30 02:47:57

質問

ここで、私の SwiftUI のコードです。

struct ContentView : View {

    @State var showingTextField = false
    @State var text = ""

    var body: some View {
        return VStack {
            if showingTextField {
                TextField($text)
            }
            Button(action: { self.showingTextField.toggle() }) {
                Text ("Show")
            }
        }
    }
}

私が欲しいのは、テキストフィールドが 見える になったとき、テキストフィールドを最初のレスポンダにすることです。(すなわち、フォーカスを受け取り、キーボードをポップアップさせる)。

どのように解決するのですか?

iOS 15.0 以降

macOS 12.0+ です。

Mac Catalyst 15.0+。

tvOS 15.0+。

watchOS 8.0+

使用方法 focused(_:) を使う。

フォーカスされた(_:)

このビューのフォーカスの状態を、与えられた ブール値 の値にバインドしてビューを修正します。

struct NameForm: View {
    
    @FocusState private var isFocused: Bool
    
    @State private var name = ""
    
    var body: some View {
        TextField("Name", text: $name)
            .focused($isFocused)
        
        Button("Submit") {
            if name.isEmpty {
                isFocued = true
            }
        }
    }
}


使用方法 focused(_:equals:) を使用します。

focused(_:equals:)

与えられた状態値にそのフォーカス状態をバインドすることによって、このビューを変更します。

struct LoginForm: View {
    enum Field: Hashable {
        case usernameField
        case passwordField
    }

    @State private var username = ""
    @State private var password = ""
    @FocusState private var focusedField: Field?

    var body: some View {
        Form {
            TextField("Username", text: $username)
                .focused($focusedField, equals: .usernameField)

            SecureField("Password", text: $password)
                .focused($focusedField, equals: .passwordField)

            Button("Sign In") {
                if username.isEmpty {
                    focusedField = .usernameField
                } else if password.isEmpty {
                    focusedField = .passwordField
                } else {
                    handleLogin(username, password)
                }
            }
        }
    }
}

SwiftUIのドキュメント


更新情報

でテストしてみました。 xCode version 13.0 beta 5 (13A5212g) . それは動作します