SwiftUI中如何实现TextField失焦/点击空白/回车时收起iOS键盘?
解决SwiftUI中TextField点击空白区域/回车收起十进制键盘的问题
一、点击空白区域收起键盘
你可以通过给根视图添加全屏点击手势实现该需求,利用ZStack将透明背景置于底层,点击空白区域时清空所有TextField的焦点状态并收起键盘。修改后的完整代码如下:
import SwiftUI struct ContentView: View { @State var textField1 = "" @State var textField2 = "" @State var hasFocus = "No text field has focus" @FocusState var leftTyping : Bool @FocusState var rightTyping : Bool var body: some View { ZStack { // 全屏透明背景,响应空白区域点击 Color.clear .onTapGesture { leftTyping = false rightTyping = false hideKeyboard() hasFocus = "No text field has focus" } VStack { Text(hasFocus) .font(.largeTitle) HStack { TextField("left" , text: $textField1) .focused($leftTyping) .keyboardType(.decimalPad) .onChange(of: leftTyping) { updateFocusStatus() } TextField("right", text: $textField2) .focused($rightTyping) .keyboardType(.decimalPad) .onChange(of: rightTyping) { updateFocusStatus() } } Button ("steal focus"){ hideKeyboard() hasFocus = "No text field has focus" } .buttonStyle(.borderedProminent) .tint(.brown) .font(.largeTitle) .padding(10) .foregroundStyle(.white) } .padding() } } // 提取重复的焦点状态更新逻辑 private func updateFocusStatus() { if !leftTyping && !rightTyping { hideKeyboard() hasFocus = "No text field has focus" } else if leftTyping { hasFocus = "focus on left field" } else if rightTyping { hasFocus = "focus on right field" } } func hideKeyboard() { UIApplication.shared.sendAction(#selector(UIResponder.resignFirstResponder), to: nil, from: nil, for: nil) } } #Preview { ContentView() }
关键说明:
- 透明背景铺满整个屏幕,仅响应空白区域的点击操作;子视图(TextField、按钮)的点击事件会优先触发,不会被背景手势干扰。
- 提取
updateFocusStatus方法,避免重复编写焦点状态判断逻辑。
二、添加"完成"按钮收起键盘(解决十进制键盘无回车的问题)
iOS十进制键盘默认没有回车按钮,你可以给TextField添加自定义工具栏,通过"完成"按钮触发收起操作。以左侧TextField为例,修改代码片段如下:
TextField("left" , text: $textField1) .focused($leftTyping) .keyboardType(.decimalPad) .onChange(of: leftTyping) { updateFocusStatus() } .toolbar { ToolbarItem(placement: .keyboard) { Button("完成") { leftTyping = false hideKeyboard() hasFocus = "No text field has focus" } } }
给右侧TextField添加同样的toolbar配置,用户点击键盘上的"完成"按钮即可收起键盘。
内容的提问来源于stack exchange,提问作者Bartender1382
相关产品推荐
相关产品推荐

