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
相关产品推荐
相关产品推荐

