Por que - [NSTextStorage replaceCharactersInRange: withAttributedString:] às vezes, às vezes não fontes de honra em outros conjuntos de caracteres?

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

  •  21-08-2019
  •  | 
  •  

Pergunta

Eu estou tentando diagnosticar um problema no UKSyntaxColoredTextDocument 0,4 http: / /www.zathras.de/angelweb/blog-uksctd-oh-four.htm em que o texto que realmente vive em uma fonte diferente do que aquele que você especificou desaparece à medida que você digita. (Você pode baixar e experimentar este utilitário legal ver este problema por si mesmo ...)

Aqui está o plano de fundo: Este é um código de coloração de sintaxe que recolors enquanto você digita. Ele funciona muito bem, mas se você digitar alguns caracteres que não fazem parte do conjunto de fontes para essa exibição de texto (por exemplo, Monaco, Helvetica) ... por exemplo, um personagem símbolo ou algo em japonês, que na verdade usa fontes como ZapfDingbatsITC ou HiraKakuProN-W3 para exibi-lo, em seguida, esses caracteres não são exibidos enquanto você digita.

Vamos dizer que você tem algum texto como este: fdsafd [?] SFD ‡ [???] [???] ...

Se você colar que no campo de texto, e alternar entre a sintaxe de coloração do pop-up, Isso chama oldRecolorRange:, com esta linha:

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

Aqui, as coisas se comportam como seria de esperar. O texto ASCII, os símbolos eo texto japoneses são todos visíveis. O valor de [textView textStorage] começa e acaba, algo como isto: (. Esta é a saída de gdb, não está mostrando os caracteres Unicode, não se preocupe com isso)

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

... mesmo depois de definir o novo valor seja

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

Em outras palavras, as fontes "estrangeiras" necessários para exibir essa string são preservadas automaticamente de alguma forma, embora as fontes não são especificados no texto de substituição.

No entanto, quando você digitar um caractere de cada vez, uma chamada diferente de replaceCharactersInRange:withAttributedString: nos resultados método recolorRange: em uma string atribuído que é somente na fonte base - fontes não-caráter estrangeira foram adicionados para nós, de modo que os caracteres fora da faixa da fonte principal não são visíveis a todos!

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

Qualquer idéia por que este método seria trabalhar uma maneira em uma circunstância e não em outro? Existe algum tipo de interruptor que eu posso passar para dar o NSTextStorage / NSAttributedString um indício de que queremos que o texto a ser exibido caracteres estrangeiros?

Foi útil?

Solução

Tente [[textView textStorage] fixFontAttributeInRange: gama]; após a [[textView textStorage] replaceCharactersInRange: gama withAttributedString: vString] em recolorRange:

Eu acho que o problema está editando o armazenamento de texto novamente em resposta a processEditing, que já é o fim da cauda de uma edição. - [NSTextStorage processEditing] usa fixFontAttributeInRange :, mas desde que você está tentando editar novamente, algo está errado e o comportamento correção está sendo descartado.

Quando você fazer isso por todo o documento, não é normal beginEditing / endEditing / seqüência que provoca fixFontAttributeInRange processEditing:. A ser chamado feliz

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top