我正在嘗試在文本框中處理換行符的 shift enter(例如 WhatsApp、Discord 等聊天應用程式實作)。目前,我使用的是 SwiftUI TextEditor,但它無法像在 AppKit 中那樣處理原始鍵盤事件。因此,一個駭人聽聞的解決方案是檢查訊息的最后一個字符是否是 .onchange 中的換行符,然后發送訊息。這種方法適用于“輸入發送”,但如果按下 shift 鍵(對于多行訊息),我找不到不發送訊息的方法。
我正在嘗試一種NSViewRepresentable使用 AppKit API 的方法,如下所示:
struct KeyEventHandling: NSViewRepresentable {
class KeyView: NSView {
override var acceptsFirstResponder: Bool { true }
override func keyDown(with event: NSEvent) {
print("keydown event")
}
override func flagsChanged(with event: NSEvent) {
switch event.modifierFlags.intersection(.deviceIndependentFlagsMask) {
case [.shift]:
print("shift key pressed")
default:
print("no modifier keys are pressed")
}
}
}
func makeNSView(context: Context) -> NSView {
let view = KeyView()
DispatchQueue.main.async { // wait till next event cycle
view.window?.makeFirstResponder(view)
}
return view
}
func updateNSView(_ nsView: NSView, context: Context) { }
}
然后我將它設定為 TextEditor 的覆寫/背景(都嘗試過),如下所示:
TextEditor(text: $message)
.overlay(KeyEventHandling())
...more modifiers
但是,它似乎只在 TextEditor 沒有聚焦時處理事件。當 TextEditor(或任何其他元素,似乎)被聚焦時,按 shift 不會呼叫 flagsChanged 覆寫。
除了將整個 TextEditor 重新實作為 a 之外,是否有更好的方法NSViewRepresentable來接收修飾鍵狀態更改?謝謝!
uj5u.com熱心網友回復:
換行的正確快捷方式實際上是 option return 并TextField支持它,例如
TextField("type something...", text: $text, onEditingChanged: { _ in
print("changed")
}, onCommit: {
print("commit")
})
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/474945.html
上一篇:java.lang.NoClassDefFoundError:org/apache/commons/io/output/UnsynchronizedByteArrayOutputStream
下一篇:從檔案中讀取矩陣
