UITableView insertSections: withRowAnimation: à l'origine de toutes les cellules du tableau pour être demandées

Je suis en train de travailler sur la modification de certains lourde de code qui appelle simplement [tableView reloadData] sur tout changement, à l'utilisation plus spécifique de la mise à jour avec les insérer/supprimer des méthodes.

Cependant, je suis vraiment un mauvais comportement. Précédemment, que l'on pourrait imaginer, lors de la table chargée, elle ne demande que les cellules pour les lignes qui ont été visibles à l'époque. C'était le comportement lors de l' reloadData a été utilisé.

Maintenant que insertSections est appelé, tous cellules sont demandées après cette mise à jour, qui peuvent être des centaines. Cette résultats dans les cellules en cours de création pour chaque ligne, complètement ruiner la réutilisables cellule de la file d'attente et d'être juste tout autour de gaspillage. Je doit être en train de faire quelque chose de mal.

Le changement est aussi simple que cela, le code que les résultats de la tableView demande seulement pour les lignes visibles:

- (void)observeValueForKeyPath:(NSString *)keyPath
                      ofObject:(id)object
                        change:(NSDictionary *)change
                       context:(void *)context {
    //... ensure it's the right key
    [tableView reloadData];
}

Code que les résultats de la tableView demande tout:

- (void)observeValueForKeyPath:(NSString *)keyPath
                      ofObject:(id)object
                        change:(NSDictionary *)change
                       context:(void *)context {
    //... ensure it's the right key
    NSUInteger sectionCount = [self sectionCount];
    NSIndexSet *indices = [NSIndexSet indexSetWithIndexesInRange:NSMakeRange(0, sectionCount)];
    [tableView insertSections:indices withRowAnimation:UITableViewRowAnimationFade];
}

Je peux basculer d'avant en arrière pour voir le changement de comportement. Frustrant. Des idées?


L'ajout d'une prime juste pour voir si quelqu'un a des plus de perspicacité.

La beginUpdates/endUpdates n'a rien, et je ne m'attends pas, c'est juste une commande, il n'y a rien de plus à se fondre dans une seule mise à jour.

Je pense que c'est simplement un effet secondaire de désirer l'animation. Tout ce qui est "slide", il a tout pour rendre. Game over.

Comment avez-vous déterminer que toutes les cellules sont demandés à la fois? Est aucun qui est retiré?
J'ai créé un petit projet de test et peut reproduire le comportement que vous observez. C'est vraiment curieux. Ne peut pas être l'animation seul, car le comportement est le même si vous spécifiez UITableViewRowAnimationNone. Le problème ne se produit pas si l'insert n'est pas à l'écran lors de la insertSections:withRowAnimation: est appelé.

OriginalL'auteur Nick Veys | 2009-07-25