UITableView rebondir vers le haut de section lors de l'appel de reloadRowsAtIndexPaths
Quand un utilisateur appuie sur un bouton dans une de mes lignes, je mets à jour le modèle sous-jacent de cette ligne, puis d'appeler reloadRowsAtIndexPaths pour la ligne de donnée (c'est à dire en une seule rangée de rechargement).
- (IBAction)handleCompleteTouchEvent:(UIButton *)sender {
NSIndexPath *indexPath = [self.tableView indexPathForView:sender];
id item = [self dataForIndexPath:indexPath];
if ([item respondsToSelector:@selector(completed)]) {
//toogle completed value
BOOL completed = ![[item valueForKey:@"completed"] boolValue];
[item setValue:[NSNumber numberWithBool:completed] forKey:@"completed"];
[self.tableView beginUpdates];
[self.tableView reloadRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationNone];
[self.tableView endUpdates];
}
}
Le problème est que l'affichage de la table rebondit vers le haut de la section après avoir fait cet appel. Comment puis-je éviter cela et de garder la position de défilement où il est?
- Le Code a l'air correct. Pouvez-vous partager plus de code qui peuvent être pertinents pour le problème? Est-il un endroit dans le code si votre vue contrôleur d'où vous appelez
[self.tableView reloadData];
? - J'ai ajouté plus de code pour montrer l'ensemble de la méthode. Une fois reloadRowsAtIndexPaths est appelée la table se déplace automatiquement vers le haut de la section, mais seulement lorsque la section d'en-tête est hors de l'écran. Il n'y a rien de spécial à propos de la création des cellules ou de la section d'en-tête (juste une chaîne de caractères).
- Je ne suis pas à l'exécution de toute reloadData ou quelque chose comme ça. Aussi, il n'y a rien dans la documentation à propos de rebondir vers le haut d'une section sur un reloadRows. Je n'ai jamais remarqué cette fonctionnalité avant, mais là encore je n'avez généralement pas de données évolution des actions au sein de la cellule elle-même, donc c'est un nouveau type d'interaction pour moi.
- Essayez de vérifier la valeur de
indexPath
reçu deindexPathForView
. Il peut êtrenil
. Si donc il doit être à l'origine de défilement vers le haut. - le indexPath est correct. C'était la première chose que j'ai vérifié. En outre, il ne rebondit pas vers le haut de la table (0,0). Il rebondit vers le haut de la section (1,0).
- C'est sûrement un bug et pas encore fixé !
Vous devez vous connecter pour publier un commentaire.
Ah Ha! J'ai trouvé le problème et je vais répondre à ma propre question pour la pauvre âme qui dirige cette question dans l'avenir.
Toutes mes cellules ont une hauteur variable, donc j'ai été en utilisant le nouveau iOS7 méthode dans UITableViewDelegate pensant qu'il pourrait accélérer les temps de rendu (non pas que j'en avais vraiment besoin):
De toute façon, la mise en œuvre de cette méthode a le mauvais effet secondaire de causer la table de rebondir vers le haut de la section lors de l'appel:
Pour résoudre le rebond de problème, j'ai juste enlevé le remplacement de cette estimatedHeightForRowAtIndexPath méthode et maintenant tout fonctionne comme il se doit. Heureux à la dernière.
estimatedRowHeight = tableView.rowHeight
dansviewDidLoad
et cela semble aider un peu. Je suis également en utilisantUITableViewAutomaticDimension
.self.tableView.rowHeight = UITableViewAutomaticDimension; self.tableView.estimatedRowHeight = 200.0f;
fonctionne aussiVous devriez être en mesure de faire ce que vous essayez de le faire en modifiant le contenu de la cellule directement. Par exemple, si vous utilisez la base de
UITableViewCell
classe et les données dans votre modèle estNSString
qui vous montrent à la vue de la table cellulaire, vous pouvez effectuer les opérations suivantes (après la modification de votre modèle de données) au lieu de l'appelerreloadRowsAtIndexPaths
:Si vous utilisez une sous-classe personnalisée de UITableViewCell, c'est à peu près le même, sauf pour accéder à la vue de la cellule devra être fait par le biais de la contentView propriété.
Cela a fait l'affaire pour moi.
Swift 4.2
Cela peut fonctionner n'importe où que vous voulez supprimer de l'animation.
Au cours de rechargement de table , table de section ou de toute ligne
Il peut être possible de mettre la cellule dans sa propre section et appel de rechargement de l'article:
cela semble résoudre le problème en partie. Pas de la façon la plus propre, mais il peut travailler pour vous.
Dans mon cas similaire, j'ai eu à retoucher la mise en œuvre de la méthode
où mon hauteurs ont été en cours de réinitialisation. Donc, au lieu de changer la hauteur de chaque cellule j'ai mis à jour uniquement effectuées cellules pour reloadRowsAtIndexPaths appel.
Si vous connaissez la hauteur minimale de votre cellule, vous devez spécifier que pendant le réglage
estimatedRowHeight
. J'ai été la valeur 1 comme je l'ai lu avant, quelque part que toute valeur supérieure à 0 suffirait à l'usage, mais il était le coupable.Quand je l'ai mis à 44 ans, qui a été à la hauteur minimum de ma cellule pourrait avoir, tout s'est bien passé.
Dynamique de la hauteur aussi bien fonctionner, pas de problèmes avec ce correctif.
À construire xsee la réponse -
J'avais mis le
Estimate
dans interface builder "automatique". J'ai changé cela à un autre numéro et il a commencé à travailler. J'ai gardéRow Height
automatique.J'ai eu le même problème. J'ai fini par appeler juste tableView.reloadData() au lieu après la mise à jour des données /de la cellule et il n'a pas rebondir vers le haut /de données a été mis en place - pour info