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

SwiftUI中垂直轴TextField的onSubmit事件未触发问题求助

解决SwiftUI多行TextField无法触发onSubmit事件的问题

当你把SwiftUI的TextField设置为axis: .vertical(多行模式)时,默认情况下onSubmit事件不会触发——因为系统把回车键当成了换行指令,而非提交信号。下面给你两种可行的解决办法:

方案一:用键盘提交按钮触发(推荐)

给TextField添加submitLabel修饰符,让键盘显示提交类按钮(比如"完成"),用户点击这个按钮就会触发onSubmit,同时回车键依然保留换行功能,符合用户的常规操作习惯。

修改你的CustomRow代码:

struct CustomRow: View {
    var title: String = ""
    @Binding var value: String

    var body: some View {
        VStack(alignment: .leading) {
            Text(title)
                .font(.system(.headline, design: .rounded))
                .foregroundColor(.gray)
            TextField("", text: $value, axis: .vertical)
                .border(.gray, width: 2)
                .padding(4)
                .font(.system(.body, design: .rounded))
                .frame(minHeight: 50, maxHeight: 200)
                .submitLabel(.done) // 设置键盘提交按钮样式,可选.done/.go/.send等
                .onSubmit {
                    print("Submit action triggered")
                    // 在这里处理焦点切换等逻辑
                }
        }
    }
}

方案二:监听回车键直接触发提交

如果你希望用户按下回车键就直接执行提交逻辑(替换换行行为),可以用onKeyPress(iOS 15+)来监听回车键事件:

struct CustomRow: View {
    var title: String = ""
    @Binding var value: String

    var body: some View {
        VStack(alignment: .leading) {
            Text(title)
                .font(.system(.headline, design: .rounded))
                .foregroundColor(.gray)
            TextField("", text: $value, axis: .vertical)
                .border(.gray, width: 2)
                .padding(4)
                .font(.system(.body, design: .rounded))
                .frame(minHeight: 50, maxHeight: 200)
                .onKeyPress(.enter) { _ in
                    print("Submit action triggered by Enter key")
                    // 处理焦点切换等操作
                    // 返回.handled会阻止换行,返回.ignored则允许换行同时触发提交
                    return .handled
                }
        }
    }
}

如果需要兼容iOS 15以下版本,可以用NotificationCenter监听UITextField的变化:

import Combine

struct CustomRow: View {
    var title: String = ""
    @Binding var value: String

    var body: some View {
        VStack(alignment: .leading) {
            Text(title)
                .font(.system(.headline, design: .rounded))
                .foregroundColor(.gray)
            TextField("", text: $value, axis: .vertical)
                .border(.gray, width: 2)
                .padding(4)
                .font(.system(.body, design: .rounded))
                .frame(minHeight: 50, maxHeight: 200)
                .onReceive(NotificationCenter.default.publisher(for: UITextField.textDidChangeNotification)) { notification in
                    guard let textField = notification.object as? UITextField,
                          let lastChar = textField.text?.last,
                          lastChar == "\n" else {
                        return
                    }
                    // 可选:移除输入的换行符
                    value = String(value.dropLast())
                    print("Submit action triggered")
                    // 处理焦点逻辑
                }
        }
    }
}

内容的提问来源于stack exchange,提问作者Ariel Antonio Fundora

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 06:53:16