import Cocoa import SwiftUI class MapTextEditorController: NSViewController { @Binding var text: String init(text: Binding) { self._text = text super.init(nibName: nil, bundle: nil) } required init?(coder: NSCoder) { fatalError("init(coder:) has not been implemented") } override func loadView() { let scrollView = NSTextView.scrollableTextView() let textView = scrollView.documentView as! NSTextView scrollView.translatesAutoresizingMaskIntoConstraints = false textView.delegate = self textView.string = self.text textView.isEditable = true textView.font = .monospacedSystemFont(ofSize: 16.0, weight: .regular) self.view = scrollView } override func viewDidAppear() { self.view.window?.makeFirstResponder(self.view) } } extension MapTextEditorController: NSTextViewDelegate { func textDidChange(_ obj: Notification) { if let textField = obj.object as? NSTextView { self.text = textField.string } } func textView(_ view: NSTextView, shouldChangeTextIn: NSRange, replacementString: String?) -> Bool { let range = Range(shouldChangeTextIn, in: view.string) let target = view.string[range!] if target == "--" { return false } return true } } struct MapTextEditor: NSViewControllerRepresentable { @Binding var text: String func makeNSViewController( context: NSViewControllerRepresentableContext ) -> MapTextEditorController { return MapTextEditorController(text: $text) } func updateNSViewController( _ nsViewController: MapTextEditorController, context: NSViewControllerRepresentableContext ) { } }