实现Markdown文本编辑器.
每行文本都是一个TextField
.
需要切换?和?上的线路
First attempt:个
TextField(...)
.onKeyPress(.downArrow) {
print("down")
return .handled
}
此事件永远不会触发
Second attempt:个
import SwiftUI
class CustomTextField: NSTextField {
override public var acceptsFirstResponder: Bool { true }
override func keyDown(with event: NSEvent) {
print("key down with character: \(String(describing: event.characters)) " )
super.keyDown(with: event)
}
}
struct LineEditor: NSViewRepresentable {
@Binding var text: String
init(_ text: Binding<String>) {
self._text = text
}
typealias NSViewType = CustomTextField
func makeNSView(context: Context) -> CustomTextField {
let view = CustomTextField(string: text)
view.delegate = context.coordinator
return view
}
func updateNSView(_ nsView: CustomTextField, context: Context) {
nsView.stringValue = text
}
class Coordinator: NSObject, NSTextFieldDelegate {
var parent: LineEditor
init(_ parent: LineEditor) {
self.parent = parent
}
func controlTextDidChange(_ obj: Notification) {
let field = obj.object as! NSTextField
self.parent.text = field.stringValue
}
}
func makeCoordinator() -> Coordinator {
return Coordinator(self)
}
}
keyDown
也从来不会被称为keyDown
.
Question:如何在现代SwiftUI
中正确跟踪按键事件?