这个简单的TextField可能是聊天功能的一部分,我希望能够在按下键盘按钮“发送”时发送聊天消息。
(想象一下,在此聊天中,我不需要通过覆盖返回键来允许用户输入换行符,以使用视图修饰符发送submitLabel(.send)。)
TextField(
"Chat...",
text: $draft
)
.submitLabel(.send)
.onSubmit {
if !draft.isEmpty {
sendMessage(draft: draft)
}
}
Run Code Online (Sandbox Code Playgroud)
但是,这会隐藏键盘,我想知道:
有什么办法可以防止按下时键盘隐藏send?
我知道如何重新聚焦该字段,我可以做到这一点,@FocusState但这仍然会导致隐藏键盘动画开始,然后中止,所以看起来很光滑。
可以使用有点“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)
| 归档时间: |
|
| 查看次数: |
2062 次 |
| 最近记录: |