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

如何配置SwiftUI TextField实现回车提交、Shift+回车输入换行

纯SwiftUI实现多行输入框:回车提交、Shift+回车换行

可以在不依赖UIKit的前提下实现该交互,推荐使用TextEditor配合自定义键盘快捷键的方案,原生支持所需逻辑:

方案一:使用TextEditor(纯SwiftUI)

TextEditor原生支持输入换行符,默认按下Shift+回车会直接插入换行;我们只需给无修饰键的回车绑定提交逻辑即可:

import SwiftUI

struct ContentView: View {
    @State private var inputText = "a\nb\nc\nd\ne"
    @FocusState private var isInputFocused: Bool
    
    var body: some View {
        VStack {
            TextEditor(text: $inputText)
                .focused($isInputFocused)
                .padding()
                .border(.gray)
                // 给无修饰键的回车绑定提交逻辑
                .keyboardShortcut(.return, modifiers: []) {
                    // 执行提交操作
                    print("提交内容:\(inputText)")
                    // 可选:清空输入框并保持焦点
                    inputText = ""
                    isInputFocused = true
                    return true
                }
            
            Button("手动提交") {
                print("提交内容:\(inputText)")
                inputText = ""
                isInputFocused = true
            }
        }
        .padding()
    }
}

逻辑说明

  • 按下Shift+回车:TextEditor原生行为,直接插入换行符,不会触发提交
  • 按下回车:触发自定义的键盘快捷键闭包,执行提交逻辑
  • @FocusState用于提交后保持输入框焦点,方便连续输入

方案二:使用TextField(需少量UIKit API)

如果必须使用TextField(axis: .vertical),可以通过检测Shift键状态来区分行为,这里会用到UIApplication的API(不属于纯SwiftUI,但无需自定义UIKit组件):

import SwiftUI

struct ContentView: View {
    @State private var inputText = "a\nb\nc\nd\ne"
    @FocusState private var isInputFocused: Bool
    
    var body: some View {
        VStack {
            TextField("", text: $inputText, axis: .vertical)
                .focused($isInputFocused)
                .padding()
                .border(.gray)
                .onSubmit {
                    // 检测Shift键是否被按住
                    let isShiftPressed = UIApplication.shared.currentEvent?.modifierFlags.contains(.shift) ?? false
                    
                    if isShiftPressed {
                        // 插入换行符并保持焦点
                        inputText += "\n"
                        isInputFocused = true
                    } else {
                        // 执行提交操作
                        print("提交内容:\(inputText)")
                        inputText = ""
                    }
                }
            
            Button("手动提交") {
                print("提交内容:\(inputText)")
                inputText = ""
                isInputFocused = true
            }
        }
        .padding()
    }
}

逻辑说明

  • 按下Shift+回车:onSubmit触发后检测到Shift键,插入换行符并重新获取焦点,避免输入框失焦
  • 按下回车:执行提交逻辑

内容的提问来源于stack exchange,提问作者graham bing

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 15:02:58