UILabel – string作为文本和链接

我有一个从服务器获取文本的UILabel 。 有些文本被认定为链接,在触摸这些链接时,应该执行一些操作。 例如

NSString * str = @“我的电话号码是645-345-2345 ,我的地址是xyz ”;

这是UILabel的完整文本。 我只有一个UILabel来显示这个文本(文本是dynamic的,我只是举了个例子)。 在点击这些链接时,我需要执行一些操作,例如导航到某个不同的屏幕或拨打电话。
我知道我可以在OHAttributedLabel的帮助下显示这样的文本。 链接可以显示如下:

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

但我不知道如何使这些文本链接执行一些行为,如导航到不同的屏幕或拨打电话。
让我知道是否需要更多的解释。

您可以将自定义操作添加到任何可用的UILabelreplace项中,这些replace项将使用后面将拦截的伪造 URLscheme来支持链接:

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

然后,在你的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是OHAttributedLabel的一个分支。

如果您想要更复杂的方法,请查看“ Nimbus Attributed标签” 。 它支持自定义链接开箱即用。

您可以使用UITextView和电话号码和链接检测YES,滚动禁用YES是否启用用户交互YES,而不是UILabel。

我的项目成功地使用了OHAttributedLabel。 看看

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

方法在OHAttributedLabelDelegate ( 链接 )。 它允许您决定单击链接时发生的情况。 如果您从OHAttributedLabel项目中查看示例的源代码,则会使用它来显示警报。 如果你在这种情况下返回NO (为了保持默认行为不发生),你可以做任何你想要的东西,如导航等。

但请注意,这要求您可以从文本中正确地确定操作。 对于我们的项目,我们使用了一个稍微更有趣的解决scheme,服务器向我们发送带有标签的文本以及每个标签执行的命令列表。

有一个名为FancyLabel的项目就是你所需要的。 可能需要一些定制。 另外,我认为Three20有这个function,但是如果你还没有使用它,可能会是一个矫枉过正的问题。

如果您的所有链接都是电话\地址\url,那么还有一个更简单的解决scheme。 您可以简单地使用UITextView而不是UILabel。 它具有自动检测电话,地址等(只需在IB中勾选)

您也可以通过覆盖openURL来执行自定义操作来响应这些链接上的单击事件,如此处所述

是否有一个特定的原因,你必须使用UILabel而不是UITextView? 请注意,许多属性标签的实现inheritance自UIView或不实现所有UILabel的function。

你可以使用自定义button看起来像链接..也可以在自定义标签上添加手势,如果你不想使用button..

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

我不是被迫使用UITextView或第三方库的粉丝,当我需要的是一个呈现链接的轻量级标签(并告诉我他们被窃听时!)

这是我的尝试在一个轻量级的UILabel子类能够检测链接水龙头。 这种方法与我见过的其他方法不同,它通过一个通过类扩展添加到NSTextStorage的委托callback来访问UILabel的共享NSLayoutManagerUILabel执行其原生布局和绘图的美妙之处在于 – 其他UILabelreplace通常用一个额外的NSLayoutManager / NSTextContainer来增加或取代本地行为。

可能App Store安全,但有些脆弱 – 使用风险自负!

https://github.com/TomSwift/TSLabel

如果您不想引入新的依赖关系,可以将标准UILabelconfiguration为显示链接并为其执行自定义操作。 看看我的StackOverflow答案。