SwiftUI:如何让 TextField 成为第一响应者? [英] SwiftUI: How to make TextField become first responder?

查看:49
本文介绍了SwiftUI:如何让 TextField 成为第一响应者?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

这是我的 SwiftUI 代码:

struct ContentView : 查看 {@State var 显示TextField = false@State var text = ""var主体:一些视图{返回 VStack {如果显示TextField {文本字段($文本)}按钮(动作:{ self.showingTextField.toggle()}){文本(显示")}}}}

我想要的是当文本字段变得可见时,使文本字段成为第一响应者(即接收焦点并弹出键盘).

解决方案

iOS 15.0+

macOS 12.0+,

Mac 催化剂 15.0+,

tvOS 15.0+,

watchOS 8.0+

如果您只有一个 TextField,请使用 focused(_:).

<块引用>

专注(_:)

通过将其焦点状态绑定到给定的 Boolean 状态值来修改此视图.

struct NameForm: View {@FocusState 私有变量 isFocused: Bool@State 私有变量名 = "";var主体:一些视图{文本字段(名称",文本:$name).focused($isFocused)按钮(提交"){如果 name.isEmpty {isFocued = 真}}}}

如果您有多个 TextField,请使用 focused(_:equals:).

<块引用>

专注(_:equals:)

通过将其焦点状态绑定到给定的状态值来修改此视图.

struct LoginForm:查看{枚举字段:Hashable {案例用户名字段案例密码字段}@State private var username = "";@State private var password = "";@FocusState 私有变量focusedField:字段?var主体:一些视图{形式 {文本字段(用户名",文本:$用户名).focused($focusedField, 等于: .usernameField)SecureField(密码",文本:$password).focused($focusedField, 等于: .passwordField)按钮(登录"){如果用户名.isEmpty {focusField = .usernameField} else if password.isEmpty {focusField = .passwordField} 别的 {句柄登录(用户名,密码)}}}}}

SwiftUI 文档

Here's my SwiftUI code:

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")
            }
        }
    }
}

What I want is when the text field becomes visible, to make the text field become the first responder (i.e. receive focus & have the keyboard pop up).

解决方案

iOS 15.0+

macOS 12.0+,

Mac Catalyst 15.0+,

tvOS 15.0+,

watchOS 8.0+

Use focused(_:) if you have a single TextField.

focused(_:)

Modifies this view by binding its focus state to the given Boolean state value.

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
            }
        }
    }
}

Use focused(_:equals:) should you have multiple TextFields.

focused(_:equals:)

Modifies this view by binding its focus state to the given state value.

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 Documentation

这篇关于SwiftUI:如何让 TextField 成为第一响应者?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆