ios uitableview uitextview ios7

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



ios7 (13)

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

Tengo UITableViewCells personalizadas que contienen un UITextView. Tengo detección de enlaces en UITextView activado en el Interface Builder. Cuando carga por primera vez la vista de tabla, todo parece estar funcionando, pero a medida que me desplazo hacia arriba y hacia abajo en la vista de tabla, la detección de enlaces se estropea. Específicamente, las celdas que solo tienen texto regular (que se presentan normalmente al principio) se muestran como enlaces (todo el texto en la vista de texto es de color azul y es un enlace activo), y los enlaces apuntan a objetos que están en algunos de los otras celdas de vista de tabla. Por ejemplo, un enlace podría apuntar a un sitio web que estaba 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 la vista de tabla se vuelven a usar, aunque el texto de la vista de texto se esté actualizando, los enlaces se guardan de alguna manera.

Esto solo ocurre en iOS 7, no en iOS 6. Sucede en el simulador y en mi dispositivo.

Aquí está el código:

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

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

Traté de agregar este código después de configurar el texto de la vista de texto para intentar restablecer los enlaces:

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

pero no cambió el comportamiento que estoy viendo.


Como cualquiera de las soluciones anteriores funcionó para mí, una solución alternativa que he encontrado es crear su UITextView cuando se supone que debe actualizar el texto para 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]; }


Configurar el texto como nil no funcionó para mí en un problema muy similar, pero al configurar scrollEnabled en NO , como se sugiere here , hice el truco para mí.

Editar: Además, todavía había un caso muy especial que causaba problemas: cuando un cuadro comenzaba con un enlace y el nuevo texto se configuraba como texto vacío (@ "" - ¡nulo!), El cuadro se "rompió" de alguna manera y desde entonces en cualquier texto nuevo se convirtió en un enlace. Mi solución fue anular setText para establecer [super texto] a @ "x" primero y luego al texto nuevo real. Establecerlo en nil en su lugar no resolvió este problema tampoco.


Encontré una mejor manera de resolver este problema. Esto requiere un paso adicional cada vez que configura texto. 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 configure en SÍ para que funcione. Cuando lo configura en NO, se elimina por completo.

Nota: Esto es solo para ios7.


Este funciona de manera confiable para mí:

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


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


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

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


Ninguna de las soluciones sugeridas funciona para mí. Así que decidí crear una nueva UITextView y reemplazarla con la anterior, cada vez que la celda se reutiliza. No es ideal para el rendimiento, pero al menos funciona.


Parece que establecer el texto en nil antes de configurar el nuevo texto no funciona. También es posible que necesite desplazarse por la vista de texto, por lo que configurar el scrollEnabled podría no ser una opción.

Sin embargo, funciona cuando crea y establece una cadena atribuida a la vista de texto de la celda. Usé una vista de colección , pero debería ser lo mismo con vistas de tabla . Escribí las siguientes líneas en la 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 :).


Puede solucionar este problema utilizando NSAttributedString.

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


También me enfrento a este problema y descubrí que para resolver esto se deben establecer las propiedades de la vista de texto en el siguiente orden:

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

Espero que esto te ayude .....


Varias sugerencias aquí y a través de enlaces proporcionados no me ayudaron con este error.

Intenté configurar el texto atribuido, estableciendo texto en cero, estableciendo el texto en @ "".

Al final forzar la vista de texto en un modo fuera de edición hizo el truco. En preparación para la reutilización

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


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