Warum - [NSTextStorage replaceCharactersInRange: withAttributedString:] manchmal, ehren manchmal nicht Schriftarten in anderen Zeichensätzen?

StackOverflow https://stackoverflow.com/questions/678620

  •  21-08-2019
  •  | 
  •  

Frage

Ich versuche, ein Problem in UKSyntaxColoredTextDocument 0,4 http zu diagnostizieren: / /www.zathras.de/angelweb/blog-uksctd-oh-four.htm wo Text, der in einer anderen Schriftart lebt tatsächlich als die von Ihnen angegebenen verschwindet während der Eingabe. (Sie können diesen kühlen Dienstprogramm herunterladen und versuchen Sie selbst heraus, um dieses Problem zu sehen ...)

Hier ist der Hintergrund: Dies ist einiger Syntaxcoloring Code, recolors während der Eingabe. Es funktioniert gut, aber wenn Sie einige Zeichen eingeben, die nicht Teil der Schriftart für die Textansicht (zB Monaco, Helvetica) ... zum Beispiel, ein Symbolzeichen oder etwas auf Japanisch festgelegt sind, die eigentlich Schriftarten wie ZapfDingbatsITC verwendet oder HiraKakuProN-W3, um sie anzuzeigen, werden diese Zeichen nicht angezeigt angezeigt werden.

Angenommen, Sie haben einen Text wie diesen: fdsafd [☀] SFDs ‡ [☀☀☀] [日本語] ...

Wenn Sie, dass in das Textfeld einfügen, und wechseln Sie unter Syntax aus der Popup-Färbung, dies ruft oldRecolorRange:, mit dieser Zeile:

[[textView textStorage] replaceCharactersInRange: range withAttributedString: vString];

Hier Dinge so verhalten, als ich erwarten würde. Der ASCII-Text, die Symbole und der japanische Text sind sichtbar. Der Wert von [Textview textStorage] beginnt und endet, so etwas wie folgt aus: (. Diese Ausgabe von gdb ist, es ist nicht die Unicode-Zeichen zeigt, nicht darüber keine Sorgen)

df{
    NSFont = "LucidaGrande 20.00 pt. P [] (0x001a3380) fobj=0x001a4970, spc=6.33";
}?{
    NSFont = "ZapfDingbatsITC 20.00 pt. P [] (0x001ae720) fobj=0x001bb370, spc=5.56";
}fdsafd[{
    NSFont = "LucidaGrande 20.00 pt. P [] (0x001a3380) fobj=0x001a4970, spc=6.33";
}?{
    NSFont = "HiraKakuProN-W3 20.00 pt. P [] (0x001b59e0) fobj=0x001bb600, spc=6.66";
}]sfds[{
...

... auch nach dem neuen Wert eingestellt sein

dffdsafd[?]sfds[???][???] Nihddfdfffdfdd{
    NSFont = "LucidaGrande 20.00 pt. P [] (0x001a3380) fobj=0x001a4970, spc=6.33";
}

Mit anderen Worten, die „fremden“ Schriftarten benötigt, um diese Zeichenfolge angezeigt wird, werden automatisch irgendwie erhalten, auch wenn die Schriften nicht in der Ersatzzeichenfolge angegeben.

Wenn Sie jedoch in einem Zeichen in einer Zeit geben, ein anderer Aufruf von replaceCharactersInRange:withAttributedString: in den Verfahren recolorRange: führt zu einem zugeschrieben String, ist nur in der Grundschrift - keine Fremd-Schriftarten aus dem Bereich des Hauptschrift wurde für uns hinzugefügt, so dass die Zeichen sind nicht sichtbar!

dffdsafd[?]sfds[???][???] Nihddfdfffdfddx{
    NSFont = "LucidaGrande 20.00 pt. P [] (0x001a3380) fobj=0x001a4970, spc=6.33";
}

Jede Idee, warum diese Methode in einem Umstand eine Art und Weise funktionieren würde und nicht in einem anderen? Gibt es irgendeine Art von Schalter, die ich passieren kann die NSTextStorage geben / NSAttributedString einen Hinweis, dass wir der Text fremde Zeichen angezeigt werden?

War es hilfreich?

Lösung

Versuchen Sie [[Textview textStorage] fixFontAttributeInRange: range]; nach dem [[Textview textStorage] replaceCharactersInRange: Bereich withAttributedString: vString] in recolorRange:

Ich denke, das Problem erneut die Textspeicher in Antwort bearbeitet zu processEditing, die bereits das hintere Ende eines bearbeiten ist. - [NSTextStorage processEditing] verwendet fixFontAttributeInRange :, aber da du wieder zu bearbeiten sind versuchen, ist etwas schief gehen und das Update Verhalten fallen gelassen wird.

Wenn Sie es für das gesamte Dokument zu tun, gibt es eine normale beginEditing / endEditing / processEditing Sequenz, die fixFontAttributeInRange verursacht. Glücklich aufgerufen werden

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top