web-dev-qa-db-fra.com

Tentative de retirer de la file d'attente plusieurs cellules pour le même chemin d'index, ce qui n'est pas autorisé

J'ai un très simple UITableView qui fonctionne très bien depuis iOS6 .... J'ai récemment essayé de créer une nouvelle version à partir d'iOS10-iOS11 et maintenant je reçois cette nouvelle exception NSInternalConsistency que je n'avais jamais vue auparavant, elle est littéralement arrivée sort du champ gauche avec la nouvelle version iOS ....

*** Application interrompue en raison d'une exception non interceptée 'NSInternalInconsistencyException', raison: 'Tentative de mise en file d'attente plusieurs cellules pour le même chemin d'index, ce qui n'est pas autorisé. Si vous vraiment besoin de retirer de la file d'attente plus de cellules que la vue de la table ne demande, utilisez la méthode -dequeueReusableCellWithIdentifier: (sans index path). Identifiant de cellule: WorkOrderCell, chemin d'index: {longueur = 2, chemin = 0 - 0} '

J'ai examiné de nombreux tutoriels et je sens qu'il n'y a rien d'exceptionnel avec ce code. En fait, une charge de grille normale fonctionne bien, voici mon code:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{

    UITableViewCell *cell = [self.tableView dequeueReusableCellWithIdentifier:@"WorkOrderCell" forIndexPath:indexPath];



    // Configure the cell...  do some work, return it



    return cell;
}

Quelqu'un d'autre a-t-il rencontré ce problème et qu'avez-vous fait pour le résoudre?

Je devrais être un peu plus spécifique, UITableView normal se charge très bien, cela signifie que j'ai un SearchBar, et lorsque l'utilisateur tape dans la recherche, je filtre les résultats et affiche une grille de résultats:

//Start Search/Filter Code
- (void)filterContentForSearchText:(NSString*)searchText scope:(NSString*)scope
{
    NSPredicate *resultPredicate = [NSPredicate predicateWithFormat:@"Job contains[cd] %@ or Address contains[cd] %@ or WorkOrderId contains[cd] %@ or Supervisor contains[cd] %@", searchText, searchText, searchText, searchText];
    self.filteredWorkOrders = [self.workOrders filteredArrayUsingPredicate:resultPredicate];
}


-(BOOL)searchDisplayController:(UISearchDisplayController *)controller shouldReloadTableForSearchString:(NSString *)searchString
{
    [self filterContentForSearchText:searchString
                               scope:[[self.searchDisplayController.searchBar scopeButtonTitles]
                                      objectAtIndex:[self.searchDisplayController.searchBar
                                                     selectedScopeButtonIndex]]];

    return YES;
}

Le code de filtre lui-même fonctionne bien, il déclenche simplement le déclenchement des délégués UITableView, qui commencent à retirer les cellules de la file d'attente (qui doivent être vides à droite dans la grille des résultats de recherche ??)

En tout état de cause, je pourrais utiliser votre aide pour celle-ci s'il vous plait .....

7
Brandon Slezak

N'utilisez pas self.tableView dans votre méthode cellForRowAtIndexPath (ou toute autre méthode de source de données et méthode de délégation). Utilisez le paramètre tableView.

Cela est très important lorsque votre source de données et vos méthodes de délégation sont utilisées pour plusieurs vues de table.

5
rmaddy

Une autre possibilité est que vous utilisiez accidentellement la méthode dequeueReusableCell plusieurs fois dans le même tableau 

Par exemple, vous pouvez également l’utiliser par inadvertance dans didSelectRowAt ou didEndDisplaying cell

3
SergPanov

Dans mon cas, j'appelais "cellForRowAt indexPath" pendant le rechargement de la table en raison d'un autre processus parallèle. Ensuite, j’ai implémenté flag et retardé la méthode "cellForRowAt indexPath" tandis que la méthode "cellForRowAt indexPath" fonctionne. Donc, il ne sera pas charger en parallèle pour la même cellule

2
ergunkocak