reloadRowsAtIndexPaths:withRowAnimation: plante mon app
J'ai un problème étrange avec mon UITableView: - je utiliser reloadRowsAtIndexPaths:withRowAnimation:
pour recharger certains des lignes spécifiques, mais l'application se bloque avec un apparemment sans rapport exception: NSInternalInconsistencyException - la Tentative de supprimer plus de lignes que exister dans la section.
Mon code se présente comme suit:
[self.tableView reloadRowsAtIndexPaths:[NSArray arrayWithObject:[NSIndexPath indexPathForRow:0 inSection:0]] withRowAnimation:UITableViewRowAnimationFade];
Lorsque je remplace que reloadRowsAtIndexPaths:withRowAnimation:
message avec un simple reloadData
, il fonctionne parfaitement.
Des idées?
- Vérifiez la même question: stackoverflow.com/questions/3542260/... peut-être que ce sera utile
Vous devez vous connecter pour publier un commentaire.
Le problème, c'est que vous, probablement, ont changé la taille de votre table. Par exemple, vous venez d'ajouter ou de supprimer une source de données pour la table de la vue.
Dans ce cas, lorsque vous appelez
reloadData
votre table est complètement rechargé, y compris les tailles des sections et le nombre de sections.Mais lorsque vous appelez
reloadRowsAtIndexPaths:withRowAnimation:
que les paramètres de votre tableau de vision ne sont pas rechargées. Qui provoque le problème suivant: lorsque vous essayez de recharger une cellule de la table de vérification de la taille de la vue de la table et voit qu'il a été modifié. Que les résultats dans un accident. Cette méthode peut être utilisée uniquement lorsque vous wan pas à recharger vue de la cellule (par exemple, l'étiquette a changé ou si vous souhaitez modifier sa taille).Maintenant, si vous souhaitez supprimer/ajouter des cellules à partir de/à la vue de la table, vous devriez utiliser l'approche suivante:
beginUpdates
deUITableView
- (void)insertRowsAtIndexPaths:(NSArray *)indexPaths withRowAnimation:(UITableViewRowAnimation)animation
- (void)deleteRowsAtIndexPaths:(NSArray *)indexPaths withRowAnimation:(UITableViewRowAnimation)animation
endUpdates
deUITableView
L'espoir qu'il sera utile
Je pense que le code suivant peut fonctionner:
J'ai eu ce problème, qui est causé par un bloc d'appel reloadRowsAtIndexPaths:withRowAnimation: et un parallèle le thread appelant reloadData.
L'accident était dû à reloadRowsAtIndexPaths:withRowAnimation trouver une table vide même si j'avais la santé mentale vérifié numberOfRowsInSection & numberOfSections.
J'ai pris l'attitude que je ne me soucie pas vraiment si elle provoque une exception. Un visuel de la corruption je pourrais vivre avec un utilisateur de l'Application que l'ensemble de l'application crash out.
Voici ma solution à ce dont je suis heureux de partager et souhaite une critique constructive. Si il y a une meilleure solution, je suis curieux de l'entendre?
J'ai eu le même problème. Dans mon cas; c'était la même chose que si un autre point de vue contrôleur de pop/poussé sur l'existant table view controller puis sur[auto.tableView reloadRowsAtIndexPaths] la fonction est appelée.
reloadRowsAtIndexPaths appel masquer/montrer les différentes lignes dans une table de la vue, qui est d'avoir plus de 30, visuellement complexe, des lignes. Comme je l'ai essayer de résoudre le problème, j'ai trouvé que si j'ai un peu de défilement de l'affichage de la table app n'a pas s'écraser. Aussi, il n'était pas de s'écraser si je n'ai pas masquer une cellule (en renvoyant 0 hauteur)
Pour résoudre le problème, j'ai simplement changé l' "(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath" fonction et retourné au moins 0,01 que la hauteur de ligne.
il a résolu le problème pour moi.
Après beaucoup d'essayer, j'ai trouvé "reloadRowsAtIndexPaths" peut être utilisé que dans certains endroits, si seulement modifier le contenu de la cellule ne pas insérer ou supprimer des cellules. Pas tout lieu peut l'utiliser, même si vous l'envelopper dans
Les endroits que j'ai trouvé qui puisse l'utiliser sont:
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
- (IBAction) unwindToMealList: (UIStoryboardSegue *) sender
Tout essayer à partir d'autres endroits comme l'appellent de "viewDidLoad" ou "viewDidAppear", soit ne prendra pas effet (Pour la cellule déjà chargé, je veux dire, recharge, pas de prise d'effet) ou la cause de l'exception.
Donc essayez d'utiliser des "reloadRowsAtIndexPaths" seulement dans ces lieux.
C'EST VIEUX. NE PAS UTILISER.
Je viens de tombé sur ce problème quand j'étais en appelant
reloadRowsAtIndexPaths...
afin de changer la cellule pour une édition d'une cellule contenant unUITextField
. L'erreur m'a dit de supprimer toutes les lignes dans la table. Pour résoudre le problème, j'ai enlevé:et l'a remplacé par
Vous devez vérifier la cellule de visibilité avant de recharger. Voici Swift 3 code:
reloadData
à la place.L'application se bloque parce que vous avez apporté des modifications à votre tableView. Soit vous avez ajouté ou supprimé des lignes à la tableView. C'est pourquoi, lorsque la vue-contrôleur demande à votre modèle de contrôleur de classe pour les données, il y a un décalage entre le indexPaths. Depuis le indexPaths ont changé après modification.
Donc, soit vous retirez simplement l'appel
ou la remplacer par
Appel reloadData vérifie votre nombre de sections, le nombre de lignes dans chaque section et de la recharge de l'ensemble de la chose.