SwiftUI隐藏键盘
SwiftUI隐藏键盘

SwiftUI隐藏键盘

问题描述

本次解决的是,在SwiftUI应用中,点击非键盘区域区域,隐藏键盘的问题。

首先,你需要给输入键盘的TextField加一个focused。

TextField("", text: $userAnswer)
    .keyboardType(.decimalPad)
.focused($isFocus)

添加focused的原因为,当你点击文本输入框时,会调起iOS的键盘,同时TextField的focused会变为true。因此,我们在focused中添加了一个名为“isFocus”的变量,来控制文本输入框是否聚焦。当我们将isFous改为false时,键盘将自动收起,以实现我们的效果。

使用”$”是为了让我们的变量实现双向绑定,改为isFocus,我们的文本输入框收起键盘,点击文本输入框,也可以改变isFocus。

接着我们需要定义一个isFocus变量,当你定义一个

@State private var isFocus = false

再次使用时,你会发现存在下面的报错:

Cannot convert value of type 'Binding<Bool>' to expected argument type 'FocusState<Bool>.Binding'

这是因为,我们的focused绑定的变量需要为FocusState类型,因此我们需要设置为

@FocusState private var isFocus = false

但这是,isFocus的变量会提醒我们:

Argument passed to call that takes no arguments

这是因为,@FocusState类型并不需要手动设置初始值(如false),它会自己管理聚焦状态,因此,只需要声明isFocus:Bool即可。

@FocusState private var isFocus: Bool

最后,我们将非键盘区域添加一个手势监听,当点击非键盘的屏幕区域时,我们将isFocus改为false。iOS自带的键盘就会自动收起,因此,我们需要在外层的视图上添加:

.onTapGesture {
    isFocus = false
}

注意:如果你添加onTapGesture后,发现点击非键盘区域,并没有收起键盘。这可能是因为你添加的视图不够外层,所以,你应该考虑将onTapGesture放到最外层的视图上,以便覆盖整个屏幕。

参考代码:

struct Game: View {
    @FocusState private var isFocus: Bool
    var body: some View {
        NavigationStack {
            VStack {
                ...
                TextField("", text: $userAnswer)
                    .focused($isFocus)
            }
        }
        .onTapGesture {
            isFocus = false
        }
    }
}

如果您认为这篇文章给您带来了帮助,您可以在此通过支付宝或者微信打赏网站开放者。

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注