IOS/Objective-C:UITextView未突出显示某些电话链接

IOS/Objective-C:UITextView未突出显示某些电话链接,ios,objective-c,datadetectortypes,Ios,Objective C,Datadetectortypes,我为一个联系人组合了一个电话号码数组,然后将其转换成一个字符串,然后插入到textView中。然后,我将textview datadetector类型设置为all 在大多数情况下,电话号码会突出显示,但在某些情况下不会突出显示。链接功能使代码检测到它们是电话链接。它们只是没有突出显示 对于给定的联系人和号码类型(如office),这不是随机发生的。如果某一类型的电话号码(如office)在给定联系人中未突出显示一次,则除非我添加或删除以下其他号码,否则该号码将永远不会突出显示 然而,在电话号码和

我为一个联系人组合了一个电话号码数组,然后将其转换成一个字符串,然后插入到textView中。然后,我将textview datadetector类型设置为all

在大多数情况下,电话号码会突出显示,但在某些情况下不会突出显示。链接功能使代码检测到它们是电话链接。它们只是没有突出显示

对于给定的联系人和号码类型(如office),这不是随机发生的。如果某一类型的电话号码(如office)在给定联系人中未突出显示一次,则除非我添加或删除以下其他号码,否则该号码将永远不会突出显示

然而,在电话号码和联系人中,这种现象似乎是随机的。对于某些联系人和号码类型,该号码会高亮显示,而对于其他联系人和号码类型,则不会高亮显示

我能辨别出的唯一其他模式是1)如果有一个以上的数字,那么之前的数字总是高亮显示,尽管最后一个数字可能会高亮显示,也可能不会高亮显示

如果后面有另一个数字,则该数字始终高亮显示

如果某个号码没有突出显示(如office),并且我在其后面添加了一个号码(如mobile),则第一个号码将突出显示,第二个号码将不突出显示。如果删除第二个数字,第一个数字将再次不突出显示

就我的生活而言,我似乎无法调试这一点,因为我真的没有理由去想为什么偶尔数字没有突出显示

下面是所使用的大部分代码。提前感谢您的建议。(我尝试在最后一个数字的末尾添加空格,但没有效果。)

//办公室
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;

    //    }
}