it-swarm.com.ru

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

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

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

Это происходит только в 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;
}

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


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

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

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

46
Darren

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

38
cbowns

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

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

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

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

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

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

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

_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. 

6
Legolas

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

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

5
Tharagon

Поскольку любое из приведенных выше решений сработало для меня, я нашел обходной путь - создайте свой 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];
}   
3
Jason LAPIERRE

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

Однако это работает, когда вы создаете и задаете атрибутивную строку для текстового представления ячейки. Я использовал collection view, но он должен быть таким же, как table views. Я написал следующие строки в 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;

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

2
Cornel

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

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

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

1
tbergmen

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

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

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

0
Desmond

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

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

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

0
Paulson Varghese