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

SwiftUI带axis参数的TextField点击Done键无法关闭键盘求助

带axis参数的TextField点击Done不关闭键盘的问题解决

这是不是Bug?

不是Bug,这是Apple的设计逻辑:带axis: .vertical参数的TextField是为多行输入场景设计的,默认点击Done按钮不会自动关闭键盘;而不带axis参数的单行TextField,点击Done会自动 resign first responder,关闭键盘。

解决方案:手动管理焦点/关闭键盘

要同时保留axis特性和点击Done关闭键盘的功能,可以通过以下两种方式实现:

方法1:使用SwiftUI原生FocusState管理焦点

利用FocusState绑定TextField的焦点状态,在onSubmit回调中主动取消焦点,从而关闭键盘:

struct Test: View {
    @State private var currentText: String = ""
    @FocusState private var isTextFieldFocused: Bool

    var body: some View {
        TextField("say something...", text: $currentText, axis: .vertical)
            .font(.subheadline)
            .lineLimit(2, reservesSpace: true)
            .padding()
            .submitLabel(.done)
            .border(.red)
            .focused($isTextFieldFocused) // 绑定焦点状态
            .onSubmit {
                isTextFieldFocused = false // 取消焦点,关闭键盘
            }
    }
}

方法2:调用UIKit的resignFirstResponder方法

通过UIApplication发送全局事件,让当前的第一响应者 resign,从而关闭键盘:

struct Test: View {
    @State private var currentText: String = ""

    var body: some View {
        TextField("say something...", text: $currentText, axis: .vertical)
            .font(.subheadline)
            .lineLimit(2, reservesSpace: true)
            .padding()
            .submitLabel(.done)
            .border(.red)
            .onSubmit {
                // 触发全局resignFirstResponder
                UIApplication.shared.sendAction(#selector(UIResponder.resignFirstResponder), to: nil, from: nil, for: nil)
            }
    }
}

两种方法都能实现需求,推荐优先使用FocusState的方式,更符合SwiftUI的原生设计逻辑。

内容的提问来源于stack exchange,提问作者24K Lin

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 10:02:41