例如,A UILabel
有@asdf when did you come?
。现在我想让@asdf
像UIButton一样行事。因此它位于UILabel
,但它的颜色不是默认颜色,当我触摸它时可以做出反应。怎么可以实现?
答案 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,以及您想要附加到这些生成的链接的行为做出反应。