【发布时间】:2021-07-13 20:51:33
【问题描述】:
当用户在 TextField 之外点击时,我正在尝试锻炼如何在 SwiftUI 中关闭键盘。我关注了其他一些帖子,这些帖子建议在 VStack 上使用 onTapGesture 并扩展 View 协议以提供一种方法来关闭从 onTapGesture 调用的键盘。
这是我的内容视图:
struct ContentView: View {
@State var text = ""
var body: some View {
VStack{
Spacer()
TextField("Text", text: $text)
Text("\(text)")
Spacer()
}
.onTapGesture {
dismissKeyboard()
}
}
}
我已经扩展了 View 协议:
extension View {
func dismissKeyboard() {
print("dismissing keyboard")
UIApplication.shared.sendAction(#selector(UIResponder.resignFirstResponder), to: nil, from: nil, for: nil)
}
}
当我运行应用程序时,只有在我点击 Text() 区域时才会关闭键盘。我会理解如果 Spacers 不存在为什么会发生这种情况,因为 VStack 仅填充它包含的视图所需的区域,但我希望当 VStack 被推到顶部时,间隔将允许 onTapGesture 为整个屏幕工作和屏幕底部,但它仍然只在点击 Text() 时有效。
当我点击 Spacers 所在的位置时 onTapGesture 不起作用并且仅在 Text 所在的位置起作用时,是否有原因?
【问题讨论】:
-
如果您将
.background(Color.red)添加到 VStack 中,它将起作用。似乎 TextField 或双 Spacers 可能会导致框架变得奇怪。我不知道为什么。