UITextViews en un error de detección de enlace UITableView en iOS 7

Tengo UITableViewCells personalizados que contienen un UITextView. Tengo la detección de enlaces en UITextView activada en Interface Builder. La primera vez que carga la vista de tabla, todo parece funcionar, pero al desplazarme hacia arriba y hacia abajo en la vista de la tabla, la detección de enlaces se desordera. Específicamente, las celdas que solo tienen text normal (que se presentan normalmente inicialmente) se muestran como enlaces (todo el text en la vista de text tiene un color azul y es un enlace activo) y los enlaces apuntan a objects que están en algunos de los otras celdas de vista de tabla. Por ejemplo, un enlace podría apuntar a un website que se encontraba en una celda de vista de tabla diferente o iniciar un correo electrónico a una dirección que estaba en una celda de vista de tabla diferente.

Parece que cuando las celdas de vista de tabla se están reutilizando, aunque el text de la vista de text se está actualizando, los enlaces de alguna manera se guardan.

Esto solo sucede en iOS 7, no en iOS 6. Ocurre en el simulador y en mi dispositivo.

Aquí está el código:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { NSString *sectionKey = [self.ordenetworkingSectionKeys 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; } 

¿Alguien sabe lo que está sucediendo aquí, y cómo resolverlo?


Intenté agregar este código después de configurar el text para ver el text, para intentar restablecer los enlaces:

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

pero no cambió el comportamiento que estoy viendo.

Esto parece ser un error en UITextView s de iOS 7.0. Una pregunta similar tiene una solución que parece ayudar: establezca el text de la vista de text en nil antes de configurarlo en la nueva cadena de text.

Varias sugerencias aquí y mediante enlaces proporcionados no me ayudaron con este error.

Intenté configurar el text atribuido, configurando el text a cero, configurando el text como @ "".

Al final forzar la vista de text en un modo editable hizo el truco. En preparación para la reutilización

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

Ninguna de estas respuestas funcionó para mí (iOS8, Swift), lo único que funcionó para mí fue primero establecer el text en nil y luego anteponer el nuevo text con un carácter unicode de espacios en blanco no \u200B (elegí \u200B , que es el carácter ZERO WIDTH SPACE pero cualquier carácter funciona):

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

Encontré una mejor manera de resolver este problema. Esto requiere un paso adicional cada vez que configura el text. Pero esto definitivamente soluciona el problema.

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

Básicamente, la detección de datos requiere que el campo selectable se establezca en SÍ para que funcione. Cuando lo establece en NO, se elimina por completo.

Nota: Esto es solo para ios7.

Establecer el text a nil no funcionó para mí en un problema muy similar, pero configurar scrollEnabled para NO , como se sugiere aquí , me sirvió el truco.

Editar: Además, todavía había un caso muy especial que causó problemas: cuando un cuadro comenzó con un enlace y el nuevo text se configuró en text vacío (@ "" – ¡no es nulo!), El cuadro de alguna manera se "rompió" y desde entonces en cualquier nuevo text se convirtió en un enlace. Mi solución fue anular SetText para establecer [súper text] en @ "x" primero y luego en el nuevo text real. Configurarlo a cero en su lugar tampoco resolvió este problema.

Como alguna de las soluciones anteriores funcionó para mí, una solución que he encontrado es crear su UITextView cuando se supone que debe actualizar el text de cada celda en lugar de reutilizarlo en la celda reutilizable.

Su código en UITableViewCellDataSource sería:

 - (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]; } 

Y en UITableViewCell :

 - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { ***your init code*** [cell updateDescriptionWithText:description]; } 

Puede solucionar este problema utilizando NSAttributedString.

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

Parece que configurar el text a nil antes de configurar el nuevo text no funciona. También podría necesitar desplazarse por la vista de text, por lo que configurar el scrollEnabled podría no ser una opción.

Sin embargo, funciona cuando creas y estableces una cadena atribuida a la vista de text de la celda. Utilicé una vista de colección , pero debería ser igual con vistas de tabla . Escribí las siguientes líneas en 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; 

Espero que esto ayude :).

Ninguna de las soluciones sugeridas funciona para mí. Entonces decidí crear un nuevo UITextView y replacelo por el antiguo, cada vez que se reutiliza la célula. No es ideal para el performance, pero al less funciona.

Este funciona de manera confiable para mí:

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

Cambiar el color Tinte a otro color realmente funciona. Sin embargo, si se puede seleccionar habilitar, el tinte también será del mismo color.

También me enfrento a este problema y descubrí que resolver esto es establecer las properties de vista de text en el siguiente order,

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

Espero que esto te ayude …..

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