2011-04-23 10 views
5

Tengo un MSMutableAttributedString displayContent. Los atributos del contenido varían a través de la cadena , es decir, los colores y tamaños de letra pueden variar por letra.appendAttributedString: en NSMutableAttributedString

Quiero agregar un nuevo carácter al final de la cadena y que recoja los atributos del último carácter en displayContent. No puedo saber cuáles son esos atributos de antemano ya que están bajo el control del usuario.

Cuando añado el nuevo carácter (tempAttr):

NSAttributedString * tempAttr = [[NSAttributedString alloc] initWithString:appendage]; 
[displayContent appendAttributedString:tempAttr]; 

aparece para restablecer los atributos de toda la cadena de los atributos del nuevo personaje (que yo no he puesto ya que no puede saber lo que necesitan ser).

¿Cómo consigo que TempAttr recoja los atributos del último carácter en displayContent? Gracias.


Actualizar. Hizo progresos en esto de una manera torpe pero funcional. Copiar los atributos Diccionario del último carácter en la pantalla (displayContent) y luego volver a aplicar esos atributos al nuevo personaje que se añade:

NSMutableDictionary * lastCharAttrs = [NSMutableDictionary dictionaryWithCapacity:5]; 
[lastCharAttrs addEntriesFromDictionary: [displayContent attributesAtIndex:0 
                  effectiveRange:NULL]]; // get style of last letter 
NSMutableAttributedString * tempAttr = [[NSMutableAttributedString alloc] initWithString:newCharacter 
                       attributes:lastCharAttrs]; 

[displayContent appendAttributedString:tempAttr]; // Append to content in the display field 

yo habría esperado que hubiera una manera más elegante de hacer esto como el establecimiento de una propiedad de NSTextField.

Respuesta

15

Creo que descubrí una solución para esto por accidente, luego encontré esta página mientras buscaba la respuesta al problema que yo mismo había creado (lo contrario de su problema).

Si hace lo siguiente:

[[displayContent mutableString] appendString:newCharacter]; 

Usted va a terminar con newCharacter adjuntas y los atributos anteriores "estirados" para cubrirlo. Sin embargo, no puedo encontrar este comportamiento documentado en ninguna parte, por lo que podría estar cansado de contar con él.

+0

Muchas gracias por el mensaje. Sustituí tu línea en el código y funcionó bien. Gracias. ¿Alguna idea de por qué esto funciona? El método mutableString devuelve simplemente el contenido de la cadena atribustring. El Doc no menciona nada sobre los atributos que se copiaron. Por lo tanto, no veo de dónde provienen los atributos de apenddedString. –

+0

No tengo ni idea. No puedo decidir si se trata de un detalle de implementación (es decir, un efecto/comportamiento secundario que puede cambiar) o si se trata de un comportamiento intencionado real. Pero al pensar en ello en oposición a "appendAttributedString:" que obviamente tiene sus propios atributos, pude ver el razonamiento de que extender la cadena subyacente debería hacer que los atributos se transfirieran. Dicho esto, cómo está realmente conectado, no tengo ni idea. –

+1

@BenCochran Tienes razón en que no se menciona específicamente nada sobre los atributos que se estiran, pero los documentos dicen: 'El receptor sigue los cambios a esta cadena y mantiene sus asignaciones de atributos actualizadas. Parece ser lo que está ocurriendo. –