2017-08-16 1 views
0

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

enter image description here

/* 
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.

Antwort

0

Nachdem ich Apple für Unterstützung kontaktiert habe, bekam ich die Antwort, hier ist es im Zitat.

das Code-Snippet Sie zeigt dass, wenn Sie aus der Zwischenablage lesen und die Textspeicherung ändern, müssen Sie nicht die anderen Komponenten notifiy shouldChangeText telefonisch unter (...) und didChangeText(), die eine Inkonsistenz verursacht zwischen dem Textspeicher und dem Rendering. Sie sollten das Problem zu beheben durch Umwickeln Sie den Code wie unten der Lage sein:

self.shouldChangeText(in:self.rangeForUserTextChange, replacementString: string) 
self.textStorage?.replaceCharacters(in: self.rangeForUserTextChange, with: string) 
self.didChangeText() 
Verwandte Themen