【问题标题】:How can I make words starting with # or @ string act like UIButton?如何使以 # 或 @ 字符串开头的单词表现得像 UIButton?
【发布时间】:2014-09-12 05:20:27
【问题描述】:

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

【问题讨论】:

  • 你不能简单地用文本 @asdf 制作一个 UIButton,它位于 Interface Builder 中 UILabel 消息的其余部分的顶部吗?
  • 问题可能更清楚,但我相信他希望与特定模式匹配的子字符串充当链接,尽管“链接”会触发他的应用程序中的操作。 #21 here looks useful。甚至还提到了 Twitter。
  • 如果是上述情况,您可以使用TTTAttributedLabel,您应该将属性字符串和它应该连接的链接传递给它。甚至@stevesliva 的回答看起来也很有用。
  • @stevesliva 你是对的!感谢您的评论。

标签: ios objective-c twitter uilabel instagram


【解决方案1】:

一个选项是创建一个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];
}];

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

【讨论】:

  • #\S+ 发出警告。使用#\\S+。谢谢。
猜你喜欢
  • 2016-01-13
  • 1970-01-01
  • 2020-03-15
  • 1970-01-01
  • 2023-01-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-19
相关资源
最近更新 更多