如何以#或@字符串开头的单词表达如UIButton?

时间:2014-09-12 05:20:28

标签: ios objective-c twitter uilabel instagram

例如,A UILabel@asdf when did you come?。现在我想让@asdf像UIButton一样行事。因此它位于UILabel,但它的颜色不是默认颜色,当我触摸它时可以做出反应。怎么可以实现?

1 个答案:

答案 0 :(得分:2)

一个选项是创建一个NSRegularExpression来定位您想要作为链接的子字符串。这将为您提供一组NSTextCheckingResult个对象,用于标识每个匹配子字符串的范围。

NSError *error = nil;
NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:@"#\S+" options:NSRegularExpressionCaseInsensitive error:&error];
NSAssert(error == nil, @"Regular expression was not valid");
NSArray *matches = [regex matchesInString:input options:0 range:NSMakeRange(0, [input length])];

然后,您可以构造一个属性字符串,用链接装饰这些范围。

NSMutableAttributedString *attributedString = [[NSMutableAttributedString alloc] initWithString:input];
[regex enumerateMatchesInString:input options:0 range:NSMakeRange(0, [input length]) usingBlock:^(NSTextCheckingResult *result, NSMatchingFlags flags, BOOL *stop) {
    NSString *hashTag = [input substringWithRange:result.range];
    NSString *linkContent = [NSString stringWithFormat:@"app-custom-scheme://hashtag?tag=%@", hashTag, nil];
    NSURL *url = [NSURL urlWithString:linkContent];
    [attributedString addAttributes:@{NSLinkAttributeName : url} range:result.range];
}];

然后,可以将此属性字符串设置为attributedText的{​​{1}},并在点按链接时调用UITextView方法-textView:shouldInteractWithURL:inRange:。现在,您只需要对这些委托方法调用或您的应用程序打开特定模式的URL,以及您想要附加到这些生成的链接的行为做出反应。