IOS / Objective-C: UITextView не выделяет некоторые телефонные ссылки - PullRequest
0 голосов
/ 03 июля 2018

Я собираю массив телефонных номеров для Контакта, а затем преобразую его в строку, которая, в свою очередь, вставляется в textView. Затем я устанавливаю для типа данных textview datadetector значение all.

В большинстве случаев номера телефонов подсвечиваются, но в некоторых случаях это не так. Ссылки функционируют так, что код определяет, что это телефонные ссылки. Они просто не выделены.

Это не случайный случай для данного контакта и типа номера, такого как офис. Если тип номера, например офис, не выделен для данного контакта один раз, он никогда не будет выделен, если я не добавлю или не удалю другие номера, как показано ниже.

Однако это явление кажется случайным по телефонным номерам и контактам. Для некоторых контактов и типов номеров номер выделен, а для других нет

Единственные другие образцы, которые я могу различить, это: 1) если имеется более одного числа, то предыдущие номера всегда подсвечиваются, хотя последний может выделяться или не выделяться.

Номер всегда подсвечивается, если после него стоит другой номер.

Если номер не выделен (например, офис), и я добавляю один после него (например, мобильный), первый номер будет выделен, а второй - нет. Если я затем удалю второе число, первое еще раз не будет выделено.

Насколько я могу судить, я не могу отладить это, поскольку на самом деле нет причин думать, почему иногда цифры не подсвечиваются.

Ниже приведен основной объем используемого кода. Спасибо заранее за любые предложения. (Я пробовал добавлять пробелы в конце последнего числа без эффекта.)

//office  
 NSString *tel = self.contact.tel== nil ? @"" : self.contact.tel;
 NSString *telfor= [self formatPhoneNum: tel];
 telfor = self.contact.tel.length<1  ? @"" :[NSString stringWithFormat: @"o: %@", telfor];
 //mobile
NSString *telmob = self.contact.telmob==nil ? @"" : self.contact.telmob;
NSString *telmobfor= [super formatPhoneNum: telmob];
telmobfor = self.contact.telmob.length<1 ? @"" :[NSString stringWithFormat: @"mob: %@", telmobfor];

    NSMutableArray *telNumsArr = [@[] mutableCopy]; 

    if (telfor.length > 0)
        [telNumsArr addObject:telfor];
    if (telmobfor.length > 0)
        [telNumsArr addObject:telmobfor];

// есть аналогичный код для других типов номеров, таких как факс NSString * telNums = [telNumsArr componentsJoinedByString: @ ""]; NSMutableArray * 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;

    //    }
}

1 Ответ

0 голосов
/ 03 июля 2018

Возможно, вам следует сообщить об ошибке в Apple. Тем не менее, Data Detectors создан для обнаружения вещей на естественном языке. Построение списка программно не поддерживается. Если вы создаете вещи программно и, следовательно, знаете, где находятся ваши телефонные номера, вы можете вручную создать ссылки tel: *. 1001 *

...