¿Por qué - [NSTextStorage replaceCharactersInRange: withAttributedString:] a veces, a veces no respeta las fuentes en otros conjuntos de caracteres?

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

  •  21-08-2019
  •  | 
  •  

Pregunta

Estoy tratando de diagnosticar un problema en UKSyntaxColoredTextDocument 0,4 http: / /www.zathras.de/angelweb/blog-uksctd-oh-four.htm donde el texto que realmente vive en un tipo de letra diferente a la que ha especificado desaparece a medida que escribe. (Puede descargar y probar esta utilidad frío para ver este problema por sí mismo ...)

Aquí está el fondo: Este es un código coloreado de sintaxis que recolors a medida que escribe. Funciona muy bien, pero si introduce algunos caracteres que no son una parte del conjunto de fuentes para esa vista de texto (por ejemplo, Mónaco, Helvetica) ... por ejemplo, un carácter de símbolo o algo en japonés, que en realidad utiliza fuentes como ZapfDingbatsITC o HiraKakuProN-W3 para mostrar que, a continuación, los caracteres no se muestran a medida que escribe.

Digamos que usted tiene un poco de texto como este: fdsafd [☀] sfds ‡ [☀☀☀] [日本語] ...

Si pega esto en el campo de texto, y cambiar entre colores de sintaxis en el menú emergente, esto invoca oldRecolorRange:, con esta línea:

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

A continuación, las cosas se comportan como me esperaba. El texto ASCII, los símbolos y el texto en japonés son visibles. El valor de [Textview textStorage] comienza y termina, algo como esto: (. Esta es la salida del BGF, no está mostrando los caracteres Unicode, no se preocupe por eso)

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

... incluso después de ajustar el nuevo valor a ser

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

En otras palabras, las fuentes "extranjeras" necesarios para mostrar esta cadena se conservan automáticamente alguna manera, a pesar de que las fuentes no se especifican en la cadena de reemplazo.

Sin embargo, cuando se escribe en un carácter a la vez, una llamada diferente de replaceCharactersInRange:withAttributedString: en el método recolorRange: da como resultado una cadena con atributos que es solamente en la base de la fuente - sin Fuentes de caracteres extranjeros se han añadido para nosotros, por lo que los personajes de la serie de la fuente principal no son visibles en absoluto!

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

Cualquier idea de por qué este método estaría trabajando de una manera en una circunstancia y no en otro? ¿Hay algún tipo de interruptor que me puede pasar a dar el NSTextStorage / NSAttributedString un indicio de que queremos que el texto que se mostrará caracteres extranjeros?

¿Fue útil?

Solución

Trate [fixFontAttributeInRange [Textview textStorage]: rango]; después de que el [[Textview textStorage] replaceCharactersInRange: gama withAttributedString: vString] en recolorRange:

Creo que el problema está Modificar el archivo de texto de nuevo en respuesta a processEditing, que ya es el final de una edición. - [NSTextStorage processEditing] utiliza fixFontAttributeInRange :, pero ya que usted está tratando de editar de nuevo, algo va mal y el comportamiento solución se dejó caer.

Cuando se realiza durante todo el documento, hay una secuencia normal / endEditing / processEditing beginEditing que causa fixFontAttributeInRange:. A ser llamado feliz

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top