UILabel – cadena como texto y enlaces

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

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 dynamic. 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 de la siguiente manera:

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

Pero me pregunto cómo puedo hacer que estos enlaces de texto realicen alguna acción, como navegación a diferentes pantallas o hacer una llamada.
Avíseme si se requiere más explicación.

Puede agregar acciones personalizadas a cualquiera de los reemplazos de UILabel disponibles que admitan enlaces utilizando un esquema de URL falso que usted interceptará más adelante:

 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 bifurcación de OHAttributedLabel.

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

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

Mi proyecto ha utilizado con éxito OHAttributedLabel para esto. Revisar la

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

método en OHAttributedLabelDelegate ( enlace ). Le permite decidir qué sucede cuando se hace clic en un enlace. Si mira la fuente del ejemplo del proyecto OHAttributedLabel , se usa para mostrar una alerta. Si devolvió NO en este caso (para evitar que la acción predeterminada también ocurra), puede hacer lo que quiera 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 tags y una lista de comandos para cada etiqueta.

Hay un proyecto llamado FancyLabel que trata 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. Tiene detección automática de teléfonos, dirección, etc. (solo marca las casillas en IB)

También puede tener acciones personalizadas en respuesta a los eventos de clic en esos enlaces sobrescribiendo OpenURL, como se explica aquí

¿Existe alguna razón específica por la que deba usar un UILabel en lugar de un UITextView? Tenga en cuenta que muchas implementaciones de tags atribuidas heredan de UIView o no implementan toda la funcionalidad de UILabel.

Puede usar el botón personalizado para darle un aspecto de enlace. También puede agregar un gesto en la etiqueta personalizada si no desea usar el botón.

 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]; 

No soy partidario de que me UITextView a usar UITextView o una UITextView terceros cuando lo único que necesito es una etiqueta liviana que represente los enlaces (¡y eso me dice cuándo están intervenidos!)

Aquí está mi bash de una subclase UILabel liviana 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 de NSLayoutManager través de una callback delegada agregada a NSTextStorage través de una extensión de categoría. La belleza es que UILabel realiza su diseño y dibujo nativo: otros reemplazos UILabel menudo aumentan o reemplazan el comportamiento nativo con un NSLayoutManager / NSTextContainer .

Probablemente App Store sea segura, pero algo frágil: ¡utilícela bajo su propio riesgo!

https://github.com/TomSwift/TSLabel