社交化越来为社会所接受,在做社会化产品时,在回复或转发时会@他人 展现出来,点击@user 跳转到该用户的介绍页面,这里首先要制定恰当的标签,比如:<at href="jecky://profile/239">iJecky</at>,然后客户端拿到文本时,要用到NSRegularExpression分割string,下面以富文本OHAttributedLabel来演示:
说明:本文中用到的contentLabel为OHAttributedLabel类型
示例:
NSString *atstring = @"测试啊测试啊 <at href="jecky://profile/239">iJecky</at> 测试啊测试啊";
首先分割:
NSMutableString *resultStr = [NSMutableString stringWithCapacity:0];
NSString *pattern = @"<at href="(.*?)">(.*?)</at>";
NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:pattern options:0 error:nil];
NSArray *matches = [regex matchesInString:atstring options:0 range:NSMakeRange(0, atstring.length)];
NSUInteger lastIdx = 0;
for (NSTextCheckingResult* match in matches)
{
NSRange range = match.range;
if (range.location > lastIdx)
{
NSString *temp = [atstring substringWithRange:NSMakeRange(lastIdx, range.location - lastIdx)];
[resultStr appendString:temp];
}
NSString *link = [atstring substringWithRange:[match rangeAtIndex:1]];
NSString *text = [atstring substringWithRange:[match rangeAtIndex:2]];
NSString *atName = [NSString stringWithFormat:@"@%@",text];
[resultStr appendString:atName];
[markDic setObject:link forKey:atName];
lastIdx = range.location + range.length;
}
if (lastIdx < atstring.length)
{
NSString *temp = [atstring substringFromIndex:lastIdx];
[resultStr appendString:temp];
}
self.contentLabel.text = resultStr;
然后展现到contentLabel上
NSRegularExpression* userRegex = [NSRegularExpression regularExpressionWithPattern:@"B@w+" options:0 error:nil];
NSMutableAttributedString* mas = [self.contentLabel.attributedText mutableCopy];
[userRegex enumerateMatchesInString:self.contentLabel.text options:0
range:NSMakeRange(0,self.contentLabel.text.length)
usingBlock:^(NSTextCheckingResult *match, NSMatchingFlags flags, BOOL *stop){
NSString *auser = [self.contentLabel.text substringWithRange:match.range];
NSString *atlink = [markDic objectForKey:auser];
if (atlink) {
[mas setLink:[NSURL URLWithString:[markDic objectForKey:auser]] range:match.range]; // add it
}
}];
OHParagraphStyle* para = [OHParagraphStyle defaultParagraphStyle];
para.firstLineHeadIndent = 0;
para.headIndent = 5;
para.tailIndent = -5;
para.textAlignment = kCTTextAlignmentLeft;
[mas setParagraphStyle:para];
[OHASBasicMarkupParser processMarkupInAttributedString:mas];
self.contentLabel.attributedText = mas;