2009-06-11 6 views
5

Estoy desarrollando una aplicación Mac en XCode. Necesito agregar un hipervínculo que navegue a un sitio en particular. Intenté esto usando un botón, pero necesito saber cómo cambiar el cursor al cursor de mano cuando el mouse está sobre ese botón.Hipervínculo en Cocoa

Respuesta

8

Creo que puede usar un NSTextField no editable para mostrar la URL. Si establece los atributos apropiadamente en NSAttributedString que establece como la propiedad del valor del campo, se mostrará como el estándar azul con subrayado y manejará el seguimiento del cursor por usted. This Apple Q & A le dice cómo establecer los atributos de una URL.

+0

El único problema con esta nota técnica de Apple es que el cursor del mouse aún cambia al cursor de estilo de entrada de texto con barra en I sobre el mouse. –

+0

Un problema más es que al hacer clic en el enlace se cambia la fuente de NSTextField al valor predeterminado del sistema. Las siguientes soluciones que fallan al forzar que el texto herede la fuente del campo de texto: '[attString addAttribute: NSFontAttributeName value: [label font] range: NSMakeRange (0, [attString length])];' –

4

Para establecer el cursor, debe utilizar el método de seguimiento del cursor addCursorRect:cursor:. Sin embargo, en realidad solo se supone que debes llamar a ese método desde el interior del método resetCursorRects. Si lo haces en cualquier otro momento, básicamente se garantiza que se ignorará.

Así que esto significa que necesita subclase NSButton (o lo que sea NSView subclase que desea utilizar) y anular resetCursorRects llamar addCursorRect:cursor: para toda la vista de bounds.

+0

trabajado para mí perfectamente, gracias. He subclase NSTextField. –

2

Me gustaría lanzar una respuesta actualizada para quien se tropiece con la siguiente.

Descubrí que cuando probé la solución especificada por Apple Q & A en la respuesta de Barry, el texto de mi enlace de etiqueta se reducía cuando se hacía clic. Después de algunas depuraciones, descubrí que el código de muestra en el artículo de Apple estaba configurando una nueva cadena atribuida, pero para empezar no estaba preservando ninguno de los atributos originales en el control de la etiqueta. La solución es simplemente comenzar con una copia de la cadena atribuida original de la etiqueta, agregar las nuevas propiedades de hipervínculo y luego actualizar la etiqueta.

He hecho una función auxiliar simple que convierte una etiqueta NSTextField en un hipervínculo. Básicamente, consolida la solución en la página de Apple sin la necesidad de agregar una extensión de categoría a NSAttributeString.

// Converts an otherwise plain NSTextField label into a hyperlink 
-(void)updateControl:(NSTextField*)control withHyperlink:(NSString*)strURL 
{ 
    // both are needed, otherwise hyperlink won't accept mousedown 
    [control setAllowsEditingTextAttributes: YES]; 
    [control setSelectable: YES]; 

    NSURL* url = [NSURL URLWithString:strURL]; 

    NSAttributedString* attrString = [control attributedStringValue]; 

    NSMutableAttributedString* attr = [[NSMutableAttributedString alloc] initWithAttributedString:attrString]; 
    NSRange range = NSMakeRange(0, [attr length]); 

    [attr addAttribute:NSLinkAttributeName value:url range:range]; 
    [attr addAttribute:NSForegroundColorAttributeName value:[NSColor blueColor] range:range ]; 
    [attr addAttribute:NSUnderlineStyleAttributeName value:[NSNumber numberWithInt:NSUnderlineStyleSingle] range:range]; 

    [control setAttributedStringValue:attr]; 
} 

para invocar a continuación que, pase la NSTextField y la cadena de URL en algún momento cuando la ventana se inicializa:

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification { 

    [self updateControl:_label withHyperlink:@"http://www.stackoverflow.com"]; 

}