2009-03-24 7 views
4

J'essaye de diagnostiquer un problème dans UKSyntaxColoredTextDocument 0.4 http://www.zathras.de/angelweb/blog-uksctd-oh-four.htm où le texte qui habite réellement dans une police différente de celle que vous avez spécifiée disparaît pendant que vous tapez. (Vous pouvez télécharger et essayer cet utilitaire cool pour voir ce problème par vous-même ...)Pourquoi - [NSTextStorage replaceCharactersInRange: withAttributedString:] parfois, parfois pas honorer les polices dans d'autres jeux de caractères?

Voici l'arrière-plan: Ceci est un code à colorier de syntaxe qui recolore que vous tapez. Cela fonctionne très bien, mais si vous entrez des caractères qui ne font pas partie de la police pour cette vue de texte (par exemple Monaco, Helvetica) ... par exemple, un symbole ou quelque chose en japonais, qui utilise des polices comme ZapfDingbatsITC ou HiraKakuProN-W3 pour l'afficher, ces caractères ne sont pas affichés lors de la frappe.

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

Si vous coller dans le champ de texte, et de basculer de la coloration syntaxique le menu contextuel, ce oldRecolorRange: invoque, 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 tous visibles. La valeur de [textView textStorage] commence et finit, quelque chose comme ceci: (Ceci 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 conservés automatiquement 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 replaceCharactersInRange:withAttributedString: dans la méthode recolorRange: de résultats dans une chaîne attribuée qui est seulement dans la police de base - pas polices de caractères étrangers ont été ajoutées pour que nous, donc les caractères hors de 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"; 
} 

Une idée de la raison pour laquelle cette méthode fonctionnerait d'une façon dans une circonstance et pas dans une autre? Y a-t-il une sorte de commutateur que je peux passer pour donner au NSTextStorage/NSAttributedString un indice que nous voulons que le texte affiche des caractères étrangers?

Répondre

4

Essayez [[textView textStorage] fixFontAttributeInRange: plage]; après le [[textView textStorage] replaceCharactersInRange: range withAttributedString: vString] dans recolorRange:

Je pense que le problème est d'éditer le stockage de texte à nouveau en réponse à processEditing, qui est déjà la fin d'un montage. - [NSTextStorage processEditing] utilise fixFontAttributeInRange :, mais comme vous essayez de modifier à nouveau, quelque chose ne va pas et le comportement de correction est abandonné.

Lorsque vous le faites pour le document entier, il existe une séquence beginEditing/endEditing/processEditing normale qui provoque l'appel de fixFontAttributeInRange: heureusement.

+0

C'est fait!De la docs: "Corrige l'attribut de police dans aRange, en affectant des polices par défaut aux caractères avec des polices illégales pour leurs scripts et en corrigeant autrement les affectations d'attributs de police." Merci! – danwood