UILabel-字符串作为文本和链接


71

我有一个UILabel从服务器获取的文本。某些文本将被识别为链接,并且在触摸这些链接时应执行一些操作。例如

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

这是的全文UILabel。我只有一个UILabel用于显示此文本(文本是动态的。我只是举了一个例子。)。单击这些链接后,我需要执行一些操作,例如导航到其他屏幕或拨打电话。
我知道我可以借助OHAttributedLabel显示此类文本。链接可以显示如下:

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

但是我不知道如何使这些文本链接执行某些操作,例如导航到不同的屏幕或进行呼叫。
让我知道是否需要更多说明。


1
从2013年开始...您只需使用UITextView并在interfaceBuilder中单击“检测链接” ...就这么简单。
Fattie


Answers:


130

您可以UILabel使用伪造的 URL方案将自定义操作添加到支持链接的任何可用替换项中,稍后将进行拦截:

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 */
    }
}

TTTAttributedLabelOHAttributedLabel的分支。

如果您想要更复杂的方法,请查看Nimbus Attributed Label。它支持现成的自定义链接。


4
只需添加以下内容:自定义网址将需要带有,//例如action://show-help。否则,该方案将是唯一有效的url属性。(如果没有双斜杠,其他所有内容将为零)。
迪马

非常感谢,我已将标签设为属性并将链接插入特殊范围。但是我无法更改它的字体大小。请帮忙。
Khalid Usman 2014年

2
ios 6+是否有任何新方法?因为支持的UILabel attributedStrings
若奥·努涅斯

tttattributedLabel源在github中不可用,是否还有其他替代方法。
Raghav 2015年

@Raghav你可以找到TTTAtributedLabel这里github.com/mattt/TTTAttributedLabel搜索,Ufffff的小时后发现!!!!!
iYoung 2015年

18

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


从2013年开始..就是这么简单
Fattie

1
@Ganesh,为什么禁用滚动功能?
brainjam 2013年

8

我的项目已为此成功使用OHAttributedLabel。看看

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

OHAttributedLabelDelegatelink)中的方法。它使您可以决定单击链接时会发生什么。如果您查看OHAttributedLabel项目中示例的源,该源用于显示警报。如果您返回NO这种情况(也可以避免执行默认操作),则可以执行导航之类的任何操作。

但是请注意,这要求您仅从文本即可正确确定操作。在我们的项目中,我们使用了一个稍微更高级的解决方案,其中服务器向我们发送了带有标签的文本以及为每个标签执行的命令列表。


6

有一个名为FancyLabel的项目可以满足您的需求。它可能需要一些定制。另外,我认为Three20具有此功能,但是如果您还没有使用它的话,可能会显得过高

如果您所有的链接都是电话\地址\网址,那么还有一个更简单的解决方案。您可以简单地使用UITextView代替UILabel。它具有电话,地址等的自动检测功能(只需选中IB中的复选框)

您也可以响应的自定义操作通过重写的OpenURL点击这些链接事件,说明这里

是否有特定的原因必须使用UILabel而不是UITextView?请注意,很多属性标签的实现都继承自UIView或未实现UILabel的全部功能。


3

您可以使用自定义按钮使链接看起来像..如果您不想使用按钮..也可以在自定义标签上添加手势。

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

我只需要使用单个标签。我无法在此处放置按钮。
Nitish 2012年

您能解释一下第二种选择吗?在这里可能有用。
Nitish 2012年

关键是链接在标签上的不同位置。职位是动态的。这种方法如何为我工作?
Nitish 2012年

3

UITextView当我需要的只是呈现链接的轻量级标签(并且告诉我何时点击链接)时,我不喜欢被迫使用或第三方lib

这是我尝试的一种轻量级UILabel子类,它能够检测链接抽头。该方法与我见过的其他方法不同,它可以通过通过类别扩展添加到的委托回调来访问UILabel共享的。这样做的好处是执行其本机布局和图形-其他替换通常会用附加的/扩展或替换本机行为。 NSLayoutManagerNSTextStorageUILabelUILabelNSLayoutManagerNSTextContainer

App Store可能安全,但有些脆弱-使用后果自负!

https://github.com/TomSwift/TSLabel


它没有自动检测功能。
尼克·科夫
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.