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

Nit*_*ish 71 iphone nsstring uilabel ios

我有一个UILabel来自服务器的文本.一些文本将被标识为链接,并且在触摸这些链接时应该执行一些操作.例如

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

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

[label1 addCustomLink:[NSURL URLWithString:@"http://www.foodreporter.net"] inRange:[txt rangeOfString:someString]];  
Run Code Online (Sandbox Code Playgroud)

但我想知道如何让这些文本链接执行某些操作,如导航到不同的屏幕或拨打电话.
如果需要更多解释,请与我们联系.

djr*_*ero 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];
Run Code Online (Sandbox Code Playgroud)

然后,在你的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 */
    }
}
Run Code Online (Sandbox Code Playgroud)

TTTAttributedLabelOHAttributedLabel的一个分支.

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

  • 只是添加到这个:自定义URL将需要一个`//`,如`action:// show-help`.否则,该方案将是唯一有效的url属性.(其他一切都是零,没有双斜线). (4认同)
  • ios 6+的任何新方法?因为UILabel支持attributesStrings (2认同)

Gan*_*esh 18

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


Mar*_*aek 9

我的项目已成功使用OHAttributedLabel.看看

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

OHAttributedLabelDelegate(链接)中的方法.它允许您决定单击链接时会发生什么.如果从OHAttributedLabel项目中查看示例的源代码,它将用于显示警报.如果你NO在这种情况下返回(为了防止默认动作发生),你可以做任何你想做的事情,比如导航等.

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


ada*_*ton 6

有一个名为FancyLabel的项目就是你所需要的.它可能需要一些定制.此外,我认为Three20具有此功能,但如果您尚未使用它,则可能是一种矫枉过正.

如果所有链接都是phone\addresses\urls,那么还有一个更简单的解决方案.您只需使用UITextView而不是UILabel即可.它具有自动检测电话,地址等功能(只需选中IB中的方框)

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

是否有特定原因必须使用UILabel而不是UITextView?请注意,很多属性标签的实现都是从UIView继承的,或者没有实现UILabel的所有功能.