You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 20:02:16