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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 01:20:04