2011-12-30 9 views
6

Tengo una etiqueta (NSTextField) en IB que está vinculada a un controlador. El controlador, en awakeFromNIB, establece el attributeStringValue de la etiqueta para que contenga texto coloreado y un enlace o dos.La cadena atribuida de NSTextField se retrasa en la representación

Cuando ve la etiqueta, contiene el valor de cadena correcto, pero parte del formato se pierde, hasta que hace clic en la etiqueta y se actualiza para contener el formato correcto.

Estoy usando este código para establecer el valor:

[self.testTextField setAllowsEditingTextAttributes:YES]; 
[self.testTextField setSelectable:YES]; 
NSMutableAttributedString *linkString = [[NSMutableAttributedString alloc] initWithString:@"hit this "]; 

[linkString beginEditing]; 

NSMutableAttributedString* attrString = [[NSMutableAttributedString alloc] initWithString:@"link"]; 
NSRange range = NSMakeRange(0, [attrString length]); 

[attrString addAttribute:NSLinkAttributeName value:[[NSURL URLWithString:@"http://google.com"] absoluteString] range:range]; 
[attrString addAttribute:NSUnderlineStyleAttributeName value:[NSNumber numberWithInt:NSUnderlinePatternDot] range:range]; 
[attrString addAttribute:NSForegroundColorAttributeName value:[NSColor blackColor] range:range]; 
[linkString appendAttributedString:attrString]; 

[linkString appendAttributedString:[[NSAttributedString alloc] initWithString:@" to search"]]; 

[linkString addAttribute:NSForegroundColorAttributeName value:[NSColor redColor] range:NSMakeRange(0, [linkString length])]; 

[linkString endEditing]; 

[self.testTextField setAttributedStringValue:linkString]; 

Sobre la base de este ejemplo, verá la cadena de color rojo y en el tipo de letra predeterminado de etiquetas. Luego, cuando hace clic en la etiqueta, la fuente cambia de tamaño y rostro y el enlace se representa mágicamente.

¿Alguna idea sobre cómo hacer que la cuerda se procese correctamente la primera vez?

+0

No es necesario llamar '' beginEditing' y endEditing' cuando se está construyendo un atribuirán cuerda. Estos métodos son solo para usar cuando la cadena se monitorea en busca de cambios, como 'NSTextStorage' para' NSTextView'. –

+0

Además, dice que el campo de texto está "vinculado" al controlador. El uso de la palabra "obligado" implica que está utilizando enlaces de cacao, pero parece que no lo está, ya que está configurando el valor del campo de texto mediante programación. ¿El enlace 'attributedStringValue' del campo de texto está vinculado a algo? –

+0

@RobKeniger Es un IBOutlet 'obligado' (¿cuál es el término correcto para eso?) – d2kagw

Respuesta

0

Por lo que yo sé, eso es solo rareza de AppKit.

He tenido éxito utilizando esta clase personalizada para hacer campos de texto como enlaces, que acaba de añadir en constructor de interfaces y establezca su valor una cadena con atributos como normal:

DSClickableURLTextField

Usted también tiene la opción de usar un NSButton, aunque eso es más de un problema, y ​​no obtiene el cursor de mano sin trabajo adicional.

4

Me encontré con este mismo problema. La solución que encontré fue establecer explícitamente NSFontAttributeName en la cadena atribuida. He creado un objeto NSFont que coincidía con el tipo de letra que me había propuesto en IB para mi campo de texto y establecer el atributo de este modo:

NSFont *font = [NSFont fontWithName:@"Lucida Grande" size:(CGFloat)13.0]; 
[attrString addAttribute:NSFontAttributeName value:font range:range]; 
Cuestiones relacionadas