我正在使用TTTAttributedLabel将格式应用于文本,但它似乎崩溃,因为我正在尝试将格式应用于包含表情符号的范围。例如:
NSString *text = @"@user1234 #hashtag"; // text.length reported as 22 by NSLog as each emoji is 2 chars in length
cell.textLabel.text = text;
int length = 8;
int start = 13;
NSRange *range = NSMakeRange(start, length);
if (!NSEqualRanges(range, NSMakeRange(NSNotFound, 0))) {
// apply formatting to TTTAttributedLabel
[cell.textLabel addLinkToURL:[NSURL URLWithString:[NSString stringWithFormat:@"someaction://hashtag/%@", [cell.textLabel.text substringWithRange:range]]] withRange:range];
}
注意:我从API传递了NSRange值,以及文本字符串。
在上面我试图将格式应用于#hashtag。通常这样可以正常工作,但因为我有表情符号中涉及的表情符号,我相信识别的范围是试图格式化表情符号,因为它们实际上是UTF值,这在TTTAttributedLabel中导致崩溃(它实际上挂起而没有崩溃,但是。 ..)
奇怪的是,如果有1个表情符号,它会正常工作,但如果有2个表情符号则会中断。
任何人都可以帮我弄清楚该做什么吗?
答案 0 :(得分:3)
问题是,字符串中Unicode值为\ U10000或更高的任何Unicode字符将在NSString
中显示为两个字符。
由于您要格式化主题标签,因此应使用更多动态方式来获取开始值和长度值。使用NSString rangeOfString
查找#
字符的位置。使用该结果和字符串的长度来获得所需的长度。
NSString *text = @"@user1234 #hashtag"; // text.length reported as 22 by NSLog as each emoji is 2 chars in length
cell.textLabel.text = text;
NSUInteger start = [text rangeOfString:@"#"];
if (start != NSNotFound) {
NSUInteger length = text.length - start;
NSRange *range = NSMakeRange(start, length);
// apply formatting to TTTAttributedLabel
[cell.textLabel addLinkToURL:[NSURL URLWithString:[NSString stringWithFormat:@"someaction://hashtag/%@", [cell.textLabel.text substringWithRange:range]]] withRange:range];
}
答案 1 :(得分:2)
我认为这是来自Twitter API,并且您正在尝试使用它们返回的实体字典。我刚刚编写代码来支持处理这些范围以及NSString
的字符串范围版本。
我的方法是“修复”Twitter返回以应对额外字符的实体字典。由于各种原因,我无法共享代码,但这就是我所做的:
unichar
之间循环遍历整个字符串unichar
,执行以下操作:
unichar
是否在代理对范围内(0xd800
- > 0xdfff
)。unichar
s表示),则将索引移动1。然后将循环计数器递增1以跳过此代理对的伙伴,因为它现在已被处理。我希望有所帮助!我也希望有一天我可以开源这段代码,因为我觉得它非常有用!