如何将 TTTAttributedLabel 与“@”和“#”一起使用?
How to use TTTAttributedLabel with '@' and '#'?
当文本中的“@”符号出现在 Twitter 中时,我需要使用 TTTAttributeLabel 可点击该部分。例如:"hi @test hello text"。
只有@test 部分可点击。 TTTAttributeLabel class 我在 uitable 查看单元格中使用,这样当用户按下标签的其他部分时 table didSelectedRowAtIndexPath 方法调用意味着不点击“@test”。
提前致谢。
您可以使用 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
}
如果你想要在 user/hashtag 录制时有不同的行为,你需要为 #hashtags 实现单独的 highlightTagsInLabel:
方法,使用不同的正则表达式和不同的 url(例如 tag:tag_string
)并在 highlightMentionsInLabel:
之后调用它
您可以为支持 links 的 UILabel 替换添加带有假 url 方案的 link,并使用委托拦截对 link 的点击。
例如:
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];
}
}
我认为您标签中的 link 不会与您的 table 视图冲突
您可以将自定义操作添加到支持使用 fake URL 方案的链接的任何可用 UILabel
替换 你稍后会拦截:
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。它支持开箱即用的自定义链接。
或
查看 RTLabel
这对我有用Swift(需要定义两个扩展)你可以在这里找到它们
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!))
}
}
}
当文本中的“@”符号出现在 Twitter 中时,我需要使用 TTTAttributeLabel 可点击该部分。例如:"hi @test hello text"。 只有@test 部分可点击。 TTTAttributeLabel class 我在 uitable 查看单元格中使用,这样当用户按下标签的其他部分时 table didSelectedRowAtIndexPath 方法调用意味着不点击“@test”。
提前致谢。
您可以使用 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
}
如果你想要在 user/hashtag 录制时有不同的行为,你需要为 #hashtags 实现单独的 highlightTagsInLabel:
方法,使用不同的正则表达式和不同的 url(例如 tag:tag_string
)并在 highlightMentionsInLabel:
您可以为支持 links 的 UILabel 替换添加带有假 url 方案的 link,并使用委托拦截对 link 的点击。
例如:
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];
}
}
我认为您标签中的 link 不会与您的 table 视图冲突
您可以将自定义操作添加到支持使用 fake URL 方案的链接的任何可用 UILabel
替换 你稍后会拦截:
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。它支持开箱即用的自定义链接。
或
查看 RTLabel
这对我有用Swift(需要定义两个扩展)你可以在这里找到它们
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!))
}
}
}