Pourquoi - [NSTextStorage replaceCharactersInRange: withAttributedString:] parfois, parfois pas honorer les polices dans d'autres jeux de caractères?

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

  •  21-08-2019
  •  | 
  •  

Question

Je suis en train de diagnostiquer un problème dans UKSyntaxColoredTextDocument 0,4 http: / /www.zathras.de/angelweb/blog-uksctd-oh-four.htm où le texte qui vit effectivement dans une police différente de celle que vous avez spécifié disparaît pendant que vous tapez. (Vous pouvez télécharger et essayer cet utilitaire cool de voir ce problème pour vous-même ...)

Voici le contexte: Ceci est un code de coloration de syntaxe recolore que vous tapez. Il fonctionne très bien, mais si vous entrez des caractères qui ne sont pas une partie de la police définie pour ce point de vue du texte (par exemple Monaco, Helvetica) ... par exemple, un caractère de symbole ou quelque chose en japonais, qui utilise en fait des polices comme ZapfDingbatsITC ou HiraKakuProN-W3 pour l'afficher, alors ces caractères ne sont pas affichés pendant que vous tapez.

Disons que vous avez un texte comme celui-ci: fdsafd [☀] SFD ‡ [☀☀☀] [日本語] ...

Si vous coller dans le champ de texte, et de basculer vers la coloration syntaxique de la fenêtre contextuelle, ce invoque oldRecolorRange:, avec cette ligne:

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

Ici, les choses se comportent comme j'attendre. Le texte ASCII, les symboles et le texte japonais sont visibles. La valeur de [textView textStorage] commence et finit, quelque chose comme ceci: (. C'est sortie de gdb, ce n'est pas montrer les caractères unicode, ne vous inquiétez pas à ce sujet)

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[{
...

... même après avoir réglé la nouvelle valeur à

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

En d'autres termes, les polices « étrangers » nécessaires pour afficher cette chaîne sont automatiquement stockées en quelque sorte, même si les polices ne sont pas spécifiées dans la chaîne de remplacement.

Cependant, lorsque vous tapez un caractère à la fois, un autre appel de la méthode dans replaceCharactersInRange:withAttributedString: résultats dans une recolorRange: chaîne qui est attribué que dans la police de base - pas polices de caractères étrangers ont été ajoutées pour nous, de sorte que les personnages sur la plage de la police principale ne sont pas visibles du tout!

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

Toute idée pourquoi cette méthode travaillerait d'une façon dans un cas et pas dans un autre? Y at-il une sorte de commutateur que je peux passer pour donner la NSTextStorage / NSAttributedString une indication que nous voulons que le texte à afficher des caractères étrangers?

Était-ce utile?

La solution

Essayez [[textView textStorage] fixFontAttributeInRange: plage]; après la [[textView textStorage] replaceCharactersInRange: Gamme withAttributedString: vstring] dans recolorRange:

Je pense que le problème est à nouveau le stockage d'éditer du texte en réponse à processEditing, qui est déjà la fin de la queue d'une édition. - [NSTextStorage processEditing] utilise fixFontAttributeInRange :, mais comme vous essayez de modifier à nouveau, quelque chose va mal et le comportement de solution est abandonnée.

Lorsque vous le faites pour le document entier, il y a une séquence beginEditing normale / endEditing / de processEditing qui provoque fixFontAttributeInRange:. À appeler joyeusement

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top