如何将TTTAttributedLabel与'@'和'#'一起使用?

问题描述:

当有人在twitter中使用文字“@”符号时,我需要使用TTTAttributeLabel单击该部分。例如:“hi @test hello text”。 只有@test部分可点击。我在uitableview单元格中使用的TTTAttributeLabel类,以便在用户按下标签的其他部分时调用table didSelectedRowAtIndexPath方法意味着不要单击'@test'。如何将TTTAttributedLabel与'@'和'#'一起使用?

在此先感谢。

您可以使用代码示例从this question(见highlightMentionsInString:功能)

然后将此代码添加到您的tableView:cellForRowAtIndexPath:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
     MyCell *cell; 
     // configure your cell 
     // ... 
     cell.attributedLabel.delegate = self; 
     cell.attributedLabel.userInteractionEnabled = YES; 
     cell.attributedLabel.text = someText; 
     [self highlightMentionsInLabel:cell.attributedLabel] 
     return cell; 
} 

- (void)highlightMentionsInLabel:(TTTAttributedLabel *)attributedLabel { 
     NSString *text = attributedLabel.text; 
     NSRegularExpression *mentionExpression = [NSRegularExpression regularExpressionWithPattern:@"(?:^|\\s)(@\\w+)" options:NO error:nil]; 
     // and so on, use code from question I linked above 
     // ... 
} 
... 

# pragma mark - TTTAttributedLabelDelegate 

- (void)attributedLabel:(TTTAttributedLabel *)label didSelectLinkWithURL:(NSURL *)url { 
    // your code here to handle `user:username` links 
} 

如果您想在用户/包括hashtag录播不同的行为,你需要针对#hashtags实施单独的highlightTagsInLabel:方法,使用不同的正则表达式和不同的网址(例如tag:tag_string)并在之后调用highlightMentionsInLabel:

+0

这个正则表达式有错误,像'@ abc @ abcde @ ab' – 2015-09-03 18:28:19

您可以为支持链接的UILabel替换添加包含假url地址的链接,并拦截使用委托链接点击链接。

例如:

TTTAttributedLabel *label = <# create the label here #>; 
NSString *labelText = @"My name is @test."; 
label.text = labelText; 
NSRange r = [labelText rangeOfString:@"Learn more"]; 
// here you can add some params to your url 
[label addLinkToURL:[NSURL URLWithString:@"your-fake-scheeme://say-hello"] withRange:r]; 

然后为你添加标签代表和实现attributedLabel:didSelectLinkWithURL:方法:

- (void)attributedLabel:(TTTAttributedLabel *)label didSelectLinkWithURL:(NSURL *)url { 
    if ([[url scheme] hasPrefix:@"your-fake-scheeme"]) { 
     if ([[url host] hasPrefix:@"say-hello"]) { 
      //parse your url and extract params to do something 
     } 
    } else { 
     // if it is a regular link open it in browser 
     [[UIApplication sharedApplication] openURL:url]; 
    } 
} 

我不认为在你的标签的链接将与您的表视图冲突

您可以将自定义操作添加到任何可用的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 */ 
    } 
} 

TTTAttributedLabel是OHAttributedLabel的一个分支。

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

OR

退房RTLabel

这斯威夫特工作对我来说(需要定义两个分机),你可以发现他们在这里

NSRange <-> Range extensions

func highlightMentionsInLabel(attributedLabel:TTTAttributedLabel){ 

    let textObject = attributedLabel.text 

    var mentionExpression:NSRegularExpression? 

    do { 
     mentionExpression = try NSRegularExpression(pattern: "(?:^|\\s)(@\\w+)", options: NSRegularExpressionOptions.CaseInsensitive) 

    }catch{ 
     print("error:\(error)") 
     return 
    } 

    if let text = textObject, let expression = mentionExpression{ 

     let matches: [NSTextCheckingResult] = expression.matchesInString(text, options: NSMatchingOptions.init(rawValue: 0), range: NSMakeRange(0, text.characters.count)) 
     for match: NSTextCheckingResult in matches { 
      let matchRange: NSRange = match.rangeAtIndex(1) 

      let swiftRange = text.rangeFromNSRange(matchRange)! 

      let mentionString: String = text.substringWithRange(swiftRange) 

      let linkRange = text.rangeOfString(mentionString) 

      let index:String.Index = mentionString.startIndex.advancedBy(1) 
      let user = mentionString.substringFromIndex(index) 
      let linkURLString: String = "user:\(user)" 
      attributedLabel.addLinkToURL(NSURL(string: linkURLString)!, withRange: linkURLString.NSRangeFromRange(linkRange!)) 
     } 
    } 
}