Ответ 1
Кажется, это ошибка в iOS 7.0 UITextView
s. A аналогичный вопрос имеет обходное решение, которое, как представляется, помогает: установите текст текстового представления nil
перед тем, как установить его в новую текстовую строку.
У меня есть пользовательский 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;
но это не изменило поведение, которое я вижу.
Кажется, это ошибка в iOS 7.0 UITextView
s. A аналогичный вопрос имеет обходное решение, которое, как представляется, помогает: установите текст текстового представления nil
перед тем, как установить его в новую текстовую строку.
Несколько предложений здесь и через предоставленные ссылки не помогли мне с этой ошибкой.
Я попытался настроить атрибутный текст, установив текст в ноль, установив текст в значение @"".
В конце концов форматирование текста в недоступном для редактирования режиме сделало трюк. При подготовке к повторному использованию
- (void)prepareForReuse
{
...
textView.editable = YES;
textView.editable = NO;
...
}
Ни один из этих ответов не работал у меня (iOS8, Swift), единственное, что сработало для меня, - это сначала установить текст в nil
, а затем добавить новый текст с символом unicidile unicode unicode (я выбрал \u200B
, который является символом ZERO WIDTH SPACE, но работает любой символ):
textView.text = nil
textView.text = "\u{200B}\(newText)"
Найден лучший способ решить эту проблему. Для этого требуется дополнительный шаг каждый раз, когда вы устанавливаете текст. Но это определенно устраняет проблему.
_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.
Настройка текста на nil
не работала для меня в очень похожей проблеме, но
установка scrollEnabled на NO
, как предложено здесь, сделала трюк для меня.
Изменить: Кроме того, все еще был очень особый случай, который вызвал проблемы: когда ящик начал с ссылки, а новый текст был установлен на пустой текст (@ "- не ноль!), Ящик как-то" сломался ", а с тех пор новый текст стал ссылкой. Моим решением было переопределить setText, чтобы сначала установить [супертекст] на" x", а затем на фактический новый текст. Установка его на нуль также не решила эту проблему.
Как и любой из вышеперечисленных решений, я нашел способ создания 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];
}
Вы можете исправить эту проблему, используя NSAttributedString.
cell.textview.attributedText = [[NSAttributedString alloc] initWithString:message.message];
Кажется, что установка текста в 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;
Надеюсь, это поможет:).
Для меня не нужны предлагаемые обходные пути. Поэтому я решил создать новый UITextView и заменить его на старый, каждый раз, когда ячейка повторно используется. Он не идеален для производительности, но, по крайней мере, он работает.
Это работает надежно для меня:
// fix url detection bug
cell.textView.dataDetectorTypes = UIDataDetectorTypeNone;
cell.textView.dataDetectorTypes = UIDataDetectorTypeLink;
На самом деле работает изменение цвета оттенка на другой цвет. Однако, если выбрано, включение оттенка также будет одного цвета.
Я также сталкиваюсь с этой проблемой, и я решил решить это, чтобы установить свойства textview в следующем порядке,
[textview setDataDetectorTypes:UIDataDetectorTypeNone ];
textView.editable = NO;
[textView setDataDetectorTypes:UIDataDetectorTypeLink];
[email protected]"The text you need to show with link";
Надеюсь, что это поможет вам.....
textView.text = nil;
textView.attributedText = nil;
textView.attributedText = [[NSAttributedString alloc] initWithString:@"your new string"];