UITextViews в ошибке обнаружения ссылок UITableView в iOS 7 - программирование
Подтвердить что ты не робот

UITextViews в ошибке обнаружения ссылок UITableView в iOS 7

У меня есть пользовательский UITableViewCells, содержащий UITextView. У меня обнаружение ссылок в UITextView включено в Interface Builder. Когда я впервые загружаю табличный вид, все работает, но когда я просматриваю вверх и вниз по представлению таблицы, обнаружение ссылок становится беспорядочным. В частности, ячейки, которые имеют обычный текст (которые представлены обычно изначально), отображаются как ссылки (весь текст в текстовом представлении окрашен в синий цвет и является активной ссылкой), а ссылки указывают на объекты, которые находятся в некоторых другие ячейки таблицы. Например, ссылка может указывать на веб-сайт, который находился в другой ячейке представления таблицы, или запустить электронное письмо по адресу, который находился в другой ячейке представления таблицы.

Похоже, что когда ячейки табличного представления повторно используются, хотя текст текстового вида обновляется, ссылки каким-то образом сохраняются.

Это происходит только в iOS 7, а не iOS 6. Это происходит в симуляторе и на моем устройстве.

Вот код:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    NSString *sectionKey = [self.orderedSectionKeys objectAtIndex:indexPath.section];
    NSDictionary *infoDictionary = [[self.tableViewData objectForKey:sectionKey] objectAtIndex:indexPath.row];

    static NSString *cellIdentifier = @"InfoDefaultTableViewCell";
    InfoDefaultTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier];
    if (cell == nil) {        
        NSArray *topLevelObjects = [[NSBundle mainBundle] loadNibNamed:@"InfoTableViewCells" owner:self options:nil];
        cell = [topLevelObjects objectAtIndex:0];
    }

    cell.bodyTextView.text = [infoDictionary objectForKey:@"description"];

    return cell;
}

Кто-нибудь знает, что здесь происходит, и как его решить?


Я попытался добавить этот код после установки текстового текста, чтобы попытаться reset ссылки:

cell.bodyTextView.dataDetectorTypes = UIDataDetectorTypeNone;
cell.bodyTextView.dataDetectorTypes = UIDataDetectorTypeAddress | UIDataDetectorTypeLink | UIDataDetectorTypePhoneNumber;

но это не изменило поведение, которое я вижу.

4b9b3361

Ответ 1

Кажется, это ошибка в iOS 7.0 UITextView s. A аналогичный вопрос имеет обходное решение, которое, как представляется, помогает: установите текст текстового представления nil перед тем, как установить его в новую текстовую строку.

Ответ 2

Несколько предложений здесь и через предоставленные ссылки не помогли мне с этой ошибкой.

Я попытался настроить атрибутный текст, установив текст в ноль, установив текст в значение @"".

В конце концов форматирование текста в недоступном для редактирования режиме сделало трюк. При подготовке к повторному использованию

- (void)prepareForReuse
{
  ...
    textView.editable = YES;
    textView.editable = NO;
  ...
}

Ответ 3

Ни один из этих ответов не работал у меня (iOS8, Swift), единственное, что сработало для меня, - это сначала установить текст в nil, а затем добавить новый текст с символом unicidile unicode unicode (я выбрал \u200B, который является символом ZERO WIDTH SPACE, но работает любой символ):

textView.text = nil
textView.text = "​\u{200B}\(newText)"

Ответ 4

Найден лучший способ решить эту проблему. Для этого требуется дополнительный шаг каждый раз, когда вы устанавливаете текст. Но это определенно устраняет проблему.

_textView.selectable = NO; // set it to NO clears all possible data detection work so far.
_textView.selectable = YES; // set it to YES so that actual links are detected.

В основном обнаружение данных требует, чтобы поле selectable было настроено на YES для работы. Когда вы установите его на NO, его полностью удалите.

Примечание. Это только для ios7.

Ответ 5

Настройка текста на nil не работала для меня в очень похожей проблеме, но установка scrollEnabled на NO, как предложено здесь, сделала трюк для меня.

Изменить: Кроме того, все еще был очень особый случай, который вызвал проблемы: когда ящик начал с ссылки, а новый текст был установлен на пустой текст (@ "- не ноль!), Ящик как-то" сломался ", а с тех пор новый текст стал ссылкой. Моим решением было переопределить setText, чтобы сначала установить [супертекст] на" x", а затем на фактический новый текст. Установка его на нуль также не решила эту проблему.

Ответ 6

Как и любой из вышеперечисленных решений, я нашел способ создания UITextView, когда вы должны обновлять текст для каждой ячейки вместо повторного использования в ячейке многократного использования.

Ваш код в UITableViewCellDataSource будет выглядеть следующим образом:

- (void)updateDescriptionWithText:(NSString *)descriptionText
{
    UITextView *descriptionTV = [[UITextView alloc] initWithFrame:aFrame];
    [descriptionTV setScrollEnabled:NO]; 
    [descriptionTV setEditable:NO]; 
    [descriptionTV setDataDetectorTypes:UIDataDetectorTypeLink]; 
    if ([descriptionV respondsToSelector:@selector(setSelectable:)]) 
     [descriptionTV  setSelectable:YES];
    [descriptionTV setText:descriptionText];
    [self addSubview:descriptionTV];
}

И в UITableViewCell:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
   ***your init code***

   [cell updateDescriptionWithText:description];
}   

Ответ 7

Вы можете исправить эту проблему, используя NSAttributedString.

cell.textview.attributedText = [[NSAttributedString alloc] initWithString:message.message];

Ответ 8

Кажется, что установка текста в nil до установки нового текста не работает. Вам также может потребоваться прокрутить текстовое представление, поэтому установка scrollEnabled может быть не такой.

Однако он работает, когда вы создаете и устанавливаете присваиваемую строку в виде текста ячейки. Я использовал представление коллекции, но он должен быть одинаковым с представлениями таблицы. Я написал следующие строки в collectionView:cellForItemAtIndexPath:

//get the color and other properties from your UITextView
UIColor *textColor = cell.textView.textColor;
UIFont *messageFont = cell.textView.font;

//create your attributed string
NSAttributedString *attributedString = [[NSAttributedString alloc] initWithString:yourStringForTheTextView attributes:@{NSForegroundColorAttributeName:textColor, NSFontAttributeName:messageFont}];

//set it to your UITextView
cell.textView.attributedText = attributedString;

Надеюсь, это поможет:).

Ответ 9

Для меня не нужны предлагаемые обходные пути. Поэтому я решил создать новый UITextView и заменить его на старый, каждый раз, когда ячейка повторно используется. Он не идеален для производительности, но, по крайней мере, он работает.

Ответ 10

Это работает надежно для меня:

// fix url detection bug
cell.textView.dataDetectorTypes = UIDataDetectorTypeNone;
cell.textView.dataDetectorTypes = UIDataDetectorTypeLink;

Ответ 11

На самом деле работает изменение цвета оттенка на другой цвет. Однако, если выбрано, включение оттенка также будет одного цвета.

Ответ 12

Я также сталкиваюсь с этой проблемой, и я решил решить это, чтобы установить свойства textview в следующем порядке,

[textview setDataDetectorTypes:UIDataDetectorTypeNone ];
textView.editable = NO;
[textView setDataDetectorTypes:UIDataDetectorTypeLink];
[email protected]"The text you need to show with link";

Надеюсь, что это поможет вам.....

Ответ 13

textView.text = nil;
textView.attributedText = nil;

textView.attributedText = [[NSAttributedString alloc] initWithString:@"your new string"];