SwiftUI:如何防止 TextField 上的“onSubmit”隐藏键盘?

Saj*_*jon 8 ios swift swiftui

这个简单的TextField可能是聊天功能的一部分,我希望能够在按下键盘按钮“发送”时发送聊天消息。

(想象一下,在此聊天中,我不需要通过覆盖返回键来允许用户输入换行符,以使用视图修饰符发送submitLabel(.send)。)

TextField(
    "Chat...",
    text: $draft
)
.submitLabel(.send)
.onSubmit {
    if !draft.isEmpty {
        sendMessage(draft: draft)
    }
}
Run Code Online (Sandbox Code Playgroud)

但是,这会隐藏键盘,我想知道:

有什么办法可以防止按下时键盘隐藏send

我知道如何重新聚焦该字段,我可以做到这一点,@FocusState但这仍然会导致隐藏键盘动画开始,然后中止,所以看起来很光滑。

Saj*_*jon 0

可以使用有点“hacky”的解决方案来防止键盘隐藏,将重新聚焦字段禁用动画结合起来。

struct ChatView {
    enum Field: String, Hashable {
        case chat
    }
    @State var draft = ""
    @FocusState var focusedField: Field?

    var body: some View {
        VStack {
            // messages view omitted
            TextField(
                "Chat...",
                text: $draft
            )
            .submitLabel(.send)
            .onSubmit {
                if !draft.isEmpty {
                    sendMessage()
                    // We just lost focus because "return" key was pressed
                    // we re-fucus
                    focusedField = .chat
                }
            }

            Button("Send") {
                sendMessage()
            }
        } 
        // Prevent hacky keyboard hide animation
        .transaction { $0.animation = nil }
    }    

    func sendMessage() {
       // impl omitted, sending message `draft` using some dependency.
    }
}

Run Code Online (Sandbox Code Playgroud)