J'utilise UITableView
dans l'une de mes applications. à l'intérieur de la ligne de tableview, j'ai un défilement horizontal UICollectionView
. Chaque fois que l'utilisateur appuie deux fois sur la cellule de la vue de collection, il renvoie l'événement au contrôleur de vue pour mettre à jour la source de données. Après la mise à jour de la source de données, je recharge cette ligne particulière en utilisant: tableView.reloadRows (at: [IndexPath (row: index, section: 0)], avec: .none)
Mais je reçois un bug de défilement étrange .
Je voulais recharger la ligne de la tableview et son contenu, c'est-à-dire le contenu de collectionview sans aucun problème d'animation ou de défilement.
J'ai essayé la solution suivante pour éviter cela mais pas de chance :(
UIView.performWithoutAnimation { self.tableView.reloadRows(at: [IndexPath(row: index, section: 0)], with: .none) }
J'ai même essayé de me souvenir du décalage du contenu de la vue tableau et de la vue collection, mais ce scintillement est toujours présent. Veuillez me guider si vous avez rencontré un tel problème
3 Réponses :
essayez tableView.reloadData () ou vous devez réorganiser l'indexPath dans l'ordre croissant, puis recharger des indexPath particuliers.
Je ne pense pas que le rechargement de la table complète soit une meilleure idée
@JarvisTheAvenger Même si vous appelez tableView.reloadData ()
la table entière ne sera pas rechargée. Seules les cellules visibles seront rechargées car les autres cellules n'existent même pas. TableView ne les crée pas par événement
@CerlinBoss tableView.reloadData () déclenchera la source de données, qui sera itérée pour toutes les données des cellules mais affectée aux seules cellules visibles.
@KumarKL je ne pense pas. Même si c'est le cas, il n'y a aucune signification dans le frontal car il ne recharge que les cellules visibles.
@CerlinBoss selon la documentation: Appelez cette méthode pour recharger toutes les données utilisées pour construire le tableau, y compris les cellules, les en-têtes et pieds de page de section, les tableaux d'index, etc. Pour plus d'efficacité, la vue de table ne réaffiche que les lignes visibles. Il ajuste les décalages si la table rétrécit à la suite du rechargement. Le délégué ou la source de données de la vue de table appelle cette méthode lorsqu'il souhaite que la vue de table recharge complètement ses données. Il ne doit pas être appelé dans les méthodes qui insèrent ou suppriment des lignes,
@KumarKL pouvez-vous montrer où dans la documentation il explique que déclenchera la source de données, qui sera itérée pour toutes les données des cellules de la partie
?. Je ne pense pas qu'il y ait quoi que ce soit qui s'appelle itération de données
. L'itération se produit en fonction du nombre de lignes et du nombre de sections mentionnées et estiméesHeight de chaque cellule.
C'est un problème de mise en page de l'interface utilisateur. Lorsque vous rechargez une cellule / section, il recalcule sa taille de contenu, d'où votre taille de contenu tableView, spécialement si vous avez une cellule de taille dynamique. Je suggérerais 2 solutions
Solution I (Hacky):
Solution II (meilleure):
Content que ce soit arrivé! :)
Avant de placer les images dans la cellule, si possible, créez des miniatures des images, qui roulent.
montre-nous le bug de défilement "bizarre"
Il défile du haut et revient à la position précédente ou à la ligne précédemment visible.
Si vous souhaitez mettre à jour cette ligne, ne la rechargez pas - Vous savez que la cellule est probablement visible, car l'utilisateur vient d'interagir avec elle. Récupérez la cellule avec
cellForRow (at :)
et mettez-la à jour. Si vous obteneznil
lorsque vous essayez de récupérer la cellule, continuez, car cette cellule n'est pas à l'écran et sera mise à jour la prochaine fois qu'elle apparaîtraNe pensez-vous pas qu'il y aura un problème majeur pour une telle mise en œuvre?
Non, la cellule est soit à l'écran, auquel cas vous pouvez la mettre à jour directement, soit elle n'est pas à l'écran, auquel cas vous n'avez rien à faire - Notez que je parle d'appeler le
UIITableView < / code> fonction
cellForRow (at :)
a>, pas la méthode de source de données que vous avez implémentée.S'il y a des secousses dans le défilement, cela sera probablement basé sur la propriété EstimatedHeight. Ajustez la hauteur estimée pour qu'elle soit proche de la hauteur moyenne des cellules et afaik que cela devrait le corriger.
@CerlinBoss Je n'ai pas défini la propriété de ligne de hauteur estimée sur la vue table