IOS/Objective-C:UITextView未突出显示某些电话链接
我为一个联系人组合了一个电话号码数组,然后将其转换成一个字符串,然后插入到textView中。然后,我将textview datadetector类型设置为all 在大多数情况下,电话号码会突出显示,但在某些情况下不会突出显示。链接功能使代码检测到它们是电话链接。它们只是没有突出显示 对于给定的联系人和号码类型(如office),这不是随机发生的。如果某一类型的电话号码(如office)在给定联系人中未突出显示一次,则除非我添加或删除以下其他号码,否则该号码将永远不会突出显示 然而,在电话号码和联系人中,这种现象似乎是随机的。对于某些联系人和号码类型,该号码会高亮显示,而对于其他联系人和号码类型,则不会高亮显示 我能辨别出的唯一其他模式是1)如果有一个以上的数字,那么之前的数字总是高亮显示,尽管最后一个数字可能会高亮显示,也可能不会高亮显示 如果后面有另一个数字,则该数字始终高亮显示 如果某个号码没有突出显示(如office),并且我在其后面添加了一个号码(如mobile),则第一个号码将突出显示,第二个号码将不突出显示。如果删除第二个数字,第一个数字将再次不突出显示 就我的生活而言,我似乎无法调试这一点,因为我真的没有理由去想为什么偶尔数字没有突出显示 下面是所使用的大部分代码。提前感谢您的建议。(我尝试在最后一个数字的末尾添加空格,但没有效果。)IOS/Objective-C:UITextView未突出显示某些电话链接,ios,objective-c,datadetectortypes,Ios,Objective C,Datadetectortypes,我为一个联系人组合了一个电话号码数组,然后将其转换成一个字符串,然后插入到textView中。然后,我将textview datadetector类型设置为all 在大多数情况下,电话号码会突出显示,但在某些情况下不会突出显示。链接功能使代码检测到它们是电话链接。它们只是没有突出显示 对于给定的联系人和号码类型(如office),这不是随机发生的。如果某一类型的电话号码(如office)在给定联系人中未突出显示一次,则除非我添加或删除以下其他号码,否则该号码将永远不会突出显示 然而,在电话号码和
//办公室
NSString*tel=self.contact.tel==nil@“”:self.contact.tel;
NSString*telfor=[self-formatPhoneNum:tel];
telfor=self.contact.tel.length 0)
[telNumsArr addObject:telmobfor];
//其他类型的号码(如传真)也有类似的代码
NSString*telNums=[telNumsArr组件由字符串连接:@”“;
NSMUTABLEARRY*contBlockArr=[@[]mutableCopy];//[[NSMutableArray alloc]init]
if (bestTel.length > 0)
[contBlockArr addObject:bestTel];
NSString *contBlock = [contBlockArr componentsJoinedByString:@"\n"];
self.textView.text = contBlock;
self.textView.dataDetectorTypes = UIDataDetectorTypeAll;
- (NSString*)formatPhoneNum: (NSString*)numberString
{
NSUInteger length = numberString.length;
BOOL hasLeadingOne = length > 0 && [numberString characterAtIndex:0] == '1';
if ((length<7) || length == 0 || (length > 10 && !hasLeadingOne) || (length > 11)) {
//this is not suitable for reformatting, leave NumberString as is.
return numberString;
}
NSUInteger index = 0;
NSMutableString *formattedString = [NSMutableString string];
if (hasLeadingOne) {
[formattedString appendString:@"1 "];
index += 1;
}
if (length - index > 3) {
NSString *areaCode = [numberString substringWithRange:NSMakeRange(index, 3)];
[formattedString appendFormat:@"(%@) ",areaCode];
index += 3;
}
if (length - index > 3) {
NSString *prefix = [numberString substringWithRange:NSMakeRange(index, 3)];
[formattedString appendFormat:@"%@-",prefix];
index += 3;
}
NSString *remainder = [numberString substringFromIndex:index];
[formattedString appendString:remainder];
return formattedString;
// }
}
if(bestTel.length>0)
[contBlockArr addObject:bestTel];
NSString*contBlock=[contBlockArr组件通过字符串连接:@“\n”];
self.textView.text=contBlock;
self.textView.dataDetectorTypes=UIDataDetectorTypeAll;
-(NSString*)formatPhoneNum:(NSString*)numberString
{
NSU整数长度=numberString.length;
BOOL hasLeadingOne=length>0&[numberString characterAtIndex:0]=“1”;
如果((长度10&&!hasLeadingOne)| |(长度>11)){
//这不适合重新格式化,请保持NumberString不变。
返回数字串;
}
整数指数=0;
NSMutableString*formattedString=[NSMutableString];
if(hasLeadingOne){
[formattedString appendString:@“1”];
指数+=1;
}
如果(长度-索引>3){
NSString*areaCode=[numberString substringWithRange:NSMakeRange(索引,3)];
[格式化字符串附录格式:@“(@)”,区号];
指数+=3;
}
如果(长度-索引>3){
NSString*前缀=[numberString substringWithRange:NSMakeRange(索引,3)];
[格式化字符串附录格式:@“%@-”,前缀];
指数+=3;
}
NSString*余数=[numberString substringFromIndex:index];
[格式化字符串appendString:余数];
返回格式化字符串;
// }
}
您可能应该向苹果公司提交一个bug。然而,数据检测器是用来检测自然语言中的事物的。不支持以编程方式生成列表。如果您以编程方式构造内容并因此知道电话号码的位置,则可以手动创建tel:links
if (bestTel.length > 0)
[contBlockArr addObject:bestTel];
NSString *contBlock = [contBlockArr componentsJoinedByString:@"\n"];
self.textView.text = contBlock;
self.textView.dataDetectorTypes = UIDataDetectorTypeAll;
- (NSString*)formatPhoneNum: (NSString*)numberString
{
NSUInteger length = numberString.length;
BOOL hasLeadingOne = length > 0 && [numberString characterAtIndex:0] == '1';
if ((length<7) || length == 0 || (length > 10 && !hasLeadingOne) || (length > 11)) {
//this is not suitable for reformatting, leave NumberString as is.
return numberString;
}
NSUInteger index = 0;
NSMutableString *formattedString = [NSMutableString string];
if (hasLeadingOne) {
[formattedString appendString:@"1 "];
index += 1;
}
if (length - index > 3) {
NSString *areaCode = [numberString substringWithRange:NSMakeRange(index, 3)];
[formattedString appendFormat:@"(%@) ",areaCode];
index += 3;
}
if (length - index > 3) {
NSString *prefix = [numberString substringWithRange:NSMakeRange(index, 3)];
[formattedString appendFormat:@"%@-",prefix];
index += 3;
}
NSString *remainder = [numberString substringFromIndex:index];
[formattedString appendString:remainder];
return formattedString;
// }
}