问题描述
本次解决的是,在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
}
}
}