46 votes

Bug de détection des liens UITextViews dans un UITableView dans iOS 7

J'ai des UITableViewCells personnalisées qui contiennent une UITextView. La détection des liens dans l'UITextView est activée dans Interface Builder. Lorsque je charge la vue tableau pour la première fois, tout semble fonctionner, mais lorsque je fais défiler la vue tableau vers le haut et vers le bas, la détection des liens est perturbée. Plus précisément, les cellules contenant du texte ordinaire (qui sont présentées normalement au départ) sont affichées comme des liens (tout le texte de la vue texte est coloré en bleu et constitue un lien actif), et les liens pointent vers des objets qui se trouvent dans certaines des autres cellules de la vue tableau. Par exemple, un lien peut pointer vers un site Web qui se trouve dans une autre cellule du tableau, ou lancer un courrier électronique vers une adresse qui se trouve dans une autre cellule du tableau.

Il semble que lorsque les cellules de la vue tableau sont réutilisées, même si le texte de la vue texte est mis à jour, les liens sont en quelque sorte enregistrés.

Cela ne se produit que dans iOS 7, pas dans iOS 6. Cela se produit dans le simulateur et sur mon appareil.

Voici le code :

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

Quelqu'un sait-il ce qui se passe ici, et comment le résoudre ?


J'ai essayé d'ajouter ce code après avoir défini l'affichage du texte, pour essayer de réinitialiser les liens :

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

mais cela n'a pas changé le comportement que je vois.

37voto

cbowns Points 1960

Il semble qu'il s'agisse d'un bogue dans l'application iOS 7.0. UITextView s. A question similaire propose une solution de contournement qui semble efficace : définissez le texte de la vue texte comme suit nil avant de le mettre à la place de la nouvelle chaîne de texte.

19voto

SuperGuyAbe Points 96

Plusieurs suggestions ici et à travers les liens fournis ne m'ont pas aidé avec ce bug.

J'ai essayé de définir le texte attribué, de définir le texte à nil, de définir le texte à @"".

En fin de compte, le fait de forcer l'affichage du texte dans un mode non modifiable a fait l'affaire. En préparation pour la réutilisation

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

16voto

melvinmt Points 11

Aucune de ces réponses n'a fonctionné pour moi (iOS8, Swift), la seule chose qui a fonctionné pour moi était de définir d'abord le texte à nil et ensuite faire précéder le nouveau texte d'un caractère unicode non-visible de l'espace blanc (j'ai choisi \u200B qui est le ESPACE DE LARGEUR NULLE mais n'importe quel personnage fonctionne) :

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

6voto

Legolas Points 6712

J'ai trouvé un meilleur moyen de résoudre ce problème. Cela nécessite une étape supplémentaire à chaque fois que vous définissez le texte. Mais cela résout définitivement le problème.

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

Fondamentalement, la détection des données nécessite selectable doit être réglé sur OUI pour fonctionner. Lorsque vous le mettez sur NON, il est complètement supprimé.

Note : Ceci est seulement pour ios7.

5voto

Tharagon Points 119

En mettant le texte à nil n'a pas fonctionné pour moi dans un problème très similaire, mais en fixant scrollEnabled à NO comme suggéré aquí a fait l'affaire pour moi.

Éditer : En outre, il y avait encore un cas très spécial qui posait problème : Lorsqu'une boîte commençait par un lien et que le nouveau texte était défini comme du texte vide (@"" - pas nil !), la boîte était en quelque sorte "cassée" et à partir de là, tout nouveau texte devenait un lien. Ma solution était de remplacer setText pour définir [super texte] par @"x" d'abord, puis par le nouveau texte. Le fait de lui attribuer la valeur nil n'a pas non plus résolu le problème.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X