2012-01-12 10 views
70

Tengo un UILabel cuyo texto obtengo de un servidor. Parte del texto debe identificarse como enlaces, y al tocar esos enlaces se debe realizar alguna acción. p.ej.UILabel - cadena como texto y enlaces

NSString * str = @ "Mi número de teléfono es 645-345-2345 y mi dirección es xyz";

Este es el texto completo para UILabel. Solo tengo un UILabel para mostrar este texto (El texto es dinámico. Acabo de dar un ejemplo). Al hacer clic en estos enlaces, necesito realizar acciones como navegar a una pantalla diferente o hacer una llamada.
Sé que puedo mostrar ese texto con la ayuda de OHAttributedLabel. Y los enlaces se pueden mostrar como sigue:

[label1 addCustomLink:[NSURL URLWithString:@"http://www.foodreporter.net"] inRange:[txt rangeOfString:someString]]; 

pero me pregunto cómo puedo hacer que estos enlaces de texto realizar alguna acción como la navegación a pantalla diferente o hacer una llamada.
Deseo saber si se requiere más explicación.

+1

A partir de 2013 ... solo usa UITextView y hace clic en "detectar enlaces" en interfaceBuilder ... es así de simple. – Fattie

+0

http://stackoverflow.com/questions/10116820/how-to-make-customlink-touchable-in-ohattributedlabel – kernix

+0

Posible duplicado de [Crear enlaces tap-able "en el texto NSAttributedText de un UILabel?] (Http://stackoverflow.com/questions/1256887/create-tap-able-links-in-the-nsattributedtext-of-a-uilabel) – NAlexN

Respuesta

129

Puede añadir acciones personalizadas a cualquiera de los UILabel suplentes que soportan enlaces usando una falsificación esquema URL que usted va a interceptar más tarde:

TTTAttributedLabel *tttLabel = <# create the label here #>; 
NSString *labelText = @"Lost? Learn more."; 
tttLabel.text = labelText; 
NSRange r = [labelText rangeOfString:@"Learn more"]; 
[tttLabel addLinkToURL:[NSURL URLWithString:@"action://show-help"] withRange:r]; 

Luego, en su TTTAttributedLabelDelegate:

- (void)attributedLabel:(TTTAttributedLabel *)label didSelectLinkWithURL:(NSURL *)url { 
    if ([[url scheme] hasPrefix:@"action"]) { 
     if ([[url host] hasPrefix:@"show-help"]) { 
      /* load help screen */ 
     } else if ([[url host] hasPrefix:@"show-settings"]) { 
      /* load settings screen */ 
     } 
    } else { 
     /* deal with http links here */ 
    } 
} 

TTTAttributedLabel es una horquilla de OHAttributedLabel.

Si desea un enfoque más complejo, eche un vistazo a Nimbus Attributed Label. Admite enlaces personalizados listos para usar.

+4

Solo para agregar a esto: la url personalizada tendrá que tener un '//' como 'action: // show-help'. De lo contrario, el esquema será la única propiedad de URL válida. (todo lo demás será nulo sin la barra doble). – Dima

+1

Graciasssssssss !!! :) TANTO – KarenAnne

+0

Muchas gracias, tengo que atribuir la etiqueta e inserté el enlace en un rango especial. Pero no puedo cambiar su tamaño de letra. Ayuda por favor. –

3

Puede utilizar botón personalizado para dar una mirada como de enlace ..Also puede agregar gesto en la etiqueta personalizada si no quieres botón para usar ..

UITapGestureRecognizer* gesture = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(userTappedOnLink:)]; 
// if labelView is not set userInteractionEnabled, you must do so 
[labelView setUserInteractionEnabled:YES]; 
[labelView addGestureRecognizer:gesture]; 
+0

Tengo que usar solo una etiqueta. No puedo colocar un botón allí. – Nitish

+0

¿Puede explicar su segunda opción? Puede ser útil aquí. – Nitish

+0

El problema es que los enlaces están en diferentes posiciones en la etiqueta. Las posiciones son dinámicas. ¿Cómo puede funcionar este enfoque para mí? – Nitish

6

Hay un proyecto llamado FancyLabel que es sobre lo que necesitas Sin embargo, podría necesitar algo de personalización. Además, creo que Three20 tiene esta funcionalidad, pero podría ser una exageración si aún no la usa.

También hay una solución mucho más simple, si todos sus enlaces son teléfonos \ direcciones \ urls. Simplemente puede usar un UITextView en lugar de un UILabel. Cuenta con detección automática de teléfonos, direcciones, etc (sólo comprobar las cajas en IB)

Puede también haber acciones personalizadas en respuesta a eventos de click en los enlaces anulando openURL, como se explica here

¿Hay una razón específica por la que debe usar un UILabel en lugar de un UITextView? Tenga en cuenta que muchas de las implementaciones de etiquetas atribuidas heredan de UIView o no implementan toda la funcionalidad de UILabel.

9

Mi proyecto ha utilizado satisfactoriamente OHAttributedLabel para esto. Compruebe a cabo el método

-(BOOL)attributedLabel:(OHAttributedLabel*)attributedLabel shouldFollowLink:(NSTextCheckingResult*)linkInfo;

en OHAttributedLabelDelegate (link). Le permite decidir qué sucede cuando se hace clic en un enlace. Si mira la fuente de the example from the OHAttributedLabel project, se usa para mostrar una alerta. Si devolvió NO en este caso (para evitar que ocurra la acción predeterminada), puede hacer lo que desee como navegación, etc.

Sin embargo, tenga en cuenta que esto requiere que pueda determinar la acción correctamente solo desde el texto . Para nuestro proyecto, utilizamos una solución ligeramente más elegante, donde el servidor nos enviaba texto con etiquetas y una lista de comandos para cada etiqueta.

18

Puede usar UITextView con detección de números de teléfono y enlaces SÍ, desplazamiento deshabilitado YES interacción del usuario habilitada SÍ, en lugar de UILabel.

+0

De 2013 en adelante ... es este simple – Fattie

+1

@Ganesh, ¿por qué el desplazamiento está deshabilitado? – brainjam

2

No soy un fan de verse obligado a utilizar UITextView o una lib tercero cuando todo lo que necesito es un sello ligero que hace que los enlaces (y que me dice cuando están girados!)

Aquí es mi intento en una subclase liviana UILabel capaz de detectar golpes de enlace. El enfoque es diferente de otros que he visto en el sentido de que obtiene acceso al UILabel compartido NSLayoutManager a través de una devolución de llamada de delegado agregada al NSTextStorage mediante una extensión de categoría. La belleza es que UILabel realiza su diseño y dibujo nativos - otros reemplazos UILabel a menudo aumentan o reemplazan el comportamiento nativo con un NSLayoutManager/NSTextContainer adicional.

Probablemente la App Store es segura, pero algo frágil: ¡úsala bajo tu propio riesgo!

https://github.com/TomSwift/TSLabel

+0

No tiene detección automática. –

0

Si no quiere traer en una nueva dependencia - es posible configurar el estándar UILabel para mostrar enlaces y realizar acciones personalizadas para ellos. Echa un vistazo a this StackOverflow respuesta mía.