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