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

