Ich habe ein Problem bezüglich meiner NSTextView Unterklasse. Meine Ansicht enthält attributierte Zeichenfolgen mit benutzerdefinierten Attributen. Daher musste ich die folgenden Pasteboard-Methoden implementieren, um sicherzustellen, dass meine benutzerdefinierten Attribute auf die Montagefläche kopiert werden.NSTextView Ziehe Text mit benutzerdefinierten Attributen
writeSelection(to:type:)
readSelection(from:type:)
In readSelection, ich manuell die Zeichenfolge auf der Montagefläche, lesen und in die textStorage bei rangeForUserTextChange des NSTextView schreiben.
override func readSelection(from pboard: NSPasteboard, type: String) -> Bool {
// Manually reads the text on the pasteboard, and write it to textStorage
if type == astroBoardAttributedString {
if let string = pboard.string(forType: astroBoardAttributedString) {
let attrString = NSAttributedString(string: string)
self.textStorage?.replaceCharacters(in: self.rangeForUserTextChange, with: attrString)
return true
}
}
return super.readSelection(from: pboard, type: type)
}
Das Problem ist jetzt, wenn ich wähle, und ziehen Sie Texte aus Zeile 5 bis unter Leitung 1, beispielsweise bis der Text unter Leitung 1 richtig eingesetzt ist, versucht das System jedoch dann Text aus zu entfernen, wo Zeile 5 verwendet sein, die 1. unterhalb der Linie hinzugefügt wurde nun enthält Linie 4, da eine zusätzliche Zeile
/*
line 1 <-- Drop after this line
line 2
line 3
line 4
line 5 <-- Drag from this line
The expected outcome is
line 1
line 5
line 2
line 3
line 4
The actual resulting outcome is
line 1
line 5
line 2
line 3
line 5
What happens is
line 1
line 5 <-- Line inserted here (correct)
line 2
line 3
line 4 <-- This line is removed instead :(
line 5 <-- This is the line that should be removed.
*/
Wie Sie sehen können, ist das System der Zeilen nach der Länge verändert wurde, zu entfernen. Ich konnte keine Methode zum Abfangen von Delegaten finden, wenn die Drag-and-Drop-Methode Text in der textStorage entfernt, die aus der Textansicht gezogen wurde.