SwiftUI:如何将TextField输入内容追加至数组并保持键盘显示?
解决SwiftUI TextField点击提交按钮追加内容并保持键盘可见的问题
你的核心需求是点击键盘提交按钮时,把输入内容追加到数组展示,同时保持键盘不收起。问题出在你设置的UITextFieldDelegate拦截了默认提交行为,导致onSubmit失效。可以通过给代理类添加回调闭包的方式,在提交时处理数组更新逻辑,同时保留键盘不收起的功能。
修改后的完整代码
import SwiftUI import SwiftUIIntrospect // 修改代理类,添加提交回调闭包 class TextFieldKeyboardBehavior: UIView, UITextFieldDelegate { // 定义闭包,用于回调提交事件 var onSubmit: (() -> Void)? func textFieldShouldReturn(_ textField: UITextField) -> Bool { // 触发提交回调 onSubmit?() // 返回false保持键盘可见 return false } } struct AddIngredientsView: View { @State var ingredient = "" @State var ingredientsArray: [String] = [] // 初始化代理时绑定回调 var textFieldKeyboardBehavior: TextFieldKeyboardBehavior = { let behavior = TextFieldKeyboardBehavior() return behavior }() var body: some View { VStack { if !ingredientsArray.isEmpty { ScrollView(.vertical, showsIndicators: false) { VStack(spacing: 10) { ForEach(ingredientsArray, id: \.self) { ingredient in Text(ingredient) } } } } TextField("Enter an ingredient", text: $ingredient) .multilineTextAlignment(.leading) .foregroundStyle(Color("SemiDarkGray")) .introspect(.textField, on: .iOS(.v13, .v14, .v15, .v16, .v17)) { textField in textField.delegate = textFieldKeyboardBehavior // 绑定提交回调逻辑 self.textFieldKeyboardBehavior.onSubmit = { guard !self.ingredient.trimmingCharacters(in: .whitespaces).isEmpty else { return } // 追加内容到数组 self.ingredientsArray.append(self.ingredient) // 清空输入框 self.ingredient = "" // 保持TextField的焦点,确保键盘不收起 textField.becomeFirstResponder() } } } .padding() } }
关键修改说明
- 代理类添加闭包:给
TextFieldKeyboardBehavior增加onSubmit闭包,在textFieldShouldReturn方法中触发这个闭包,把提交事件传递给SwiftUI视图。 - 绑定回调逻辑:在
introspect内部给代理的onSubmit赋值,处理数组追加、清空输入框的逻辑,同时调用textField.becomeFirstResponder()确保键盘保持激活状态。 - 空值判断:添加了输入内容的空值过滤,避免添加空字符串到数组。
这样既实现了点击提交按钮追加内容的需求,又保持了键盘可见,同时不会出现FocusedState带来的弹跳动画问题。
内容的提问来源于stack exchange,提问作者lex
相关产品推荐
相关产品推荐

