1
votes

UITableView - méthode reloadRows créant un bug de défilement weired

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


7 commentaires

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 obtenez nil 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îtra


Ne 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 :) , 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


3 Réponses :


-1
votes

essayez tableView.reloadData () ou vous devez réorganiser l'indexPath dans l'ordre croissant, puis recharger des indexPath particuliers.


6 commentaires

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.



2
votes

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):

  • enregistrer le décalage de contenu de la vue actuelle avant l'état de rechargement de la vue de table, puis faire défiler jusqu'à celui-ci après le processus de rechargement sans animation

Solution II (meilleure):

  • Mettez à jour vos sources de données et leurs cellules liées directement sans recharger votre UITableView (envisagez peut-être de mettre à jour votre UICollectionView à la place - à moins qu'il ne soit dynamiquement haché, vous devrez animer la hauteur de votre UITableViewCell).

1 commentaires

Content que ce soit arrivé! :)



0
votes

Avant de placer les images dans la cellule, si possible, créez des miniatures des images, qui roulent.


0 commentaires