Comment résoudre le problème de réutilisation des cellules dans les tableaux ou collections?
sobes.tech IA
Réponse de l'IA
Le problème de réutilisation des cellules (cell reuse) dans UITableView et UICollectionView est lié au fait que, lors du défilement de la table ou de la collection, le système réutilise les cellules qui ont quitté la zone visible pour afficher un nouveau contenu. Si la cellule n'est pas correctement préparée avant utilisation, elle peut afficher des données anciennes ou un état incorrect.
La solution consiste en ce qui suit :
-
Enregistrer la cellule : Avant d'utiliser la cellule, il est nécessaire de l'enregistrer pour la réutilisation avec un identifiant spécifique.
// Enregistrement pour UITableView tableView.register(MyCustomCell.self, forCellReuseIdentifier: "MyCellIdentifier") // Enregistrement pour UICollectionView collectionView.register(MyCustomCell.self, forCellWithReuseIdentifier: "MyCellIdentifier")Cela permet au système de gérer efficacement le pool de cellules réutilisables.
-
Obtenir la cellule réutilisable : Dans les méthodes
tableView(_:cellForRowAt:)oucollectionView(_:cellForItemAt:), il faut demander la cellule réutilisable via l'identifiant enregistré.// Pour UITableView guard let cell = tableView.dequeueReusableCell(withIdentifier: "MyCellIdentifier", for: indexPath) as? MyCustomCell else { fatalError("Échec du dequeue de MyCustomCell") // Utilisation de la récupération garantie avec vérification de type }// Pour UICollectionView guard let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "MyCellIdentifier", for: indexPath) as? MyCustomCell else { fatalError("Échec du dequeue de MyCustomCell") // Utilisation de la récupération garantie avec vérification de type }Les méthodes
dequeueReusableCell(withIdentifier:for:)oudequeueReusableCell(withReuseIdentifier:for:)retournent soit une cellule existante du pool, soit en créent une nouvelle si le pool est vide. -
Configurer la cellule : Après avoir obtenu la cellule, il faut définir les données correctes pour le
indexPathactuel (indice de ligne/élément). C'est une étape clé pour résoudre le problème de réutilisation.// Dans la méthode cellForRowAt ou cellForItemAt let data = dataArray[indexPath.row] // Exemple d'obtention de données du tableau cell.configure(with: data) // Appel à la méthode de configuration de la cellule avec les données nécessaires -
La méthode
prepareForReuse(): La surcharge de la méthodeprepareForReuse()dans la classe personnalisée de la cellule permet de nettoyer ou de réinitialiser l'état de la cellule avant qu'elle ne soit ajoutée au pool pour réutilisation. Cela est utile pour nettoyer les images, les états des interrupteurs, annuler des opérations asynchrones, etc.// Dans la classe MyCustomCell override func prepareForReuse() { super.prepareForReuse() // Réinitialiser les éléments UI imageView.image = nil titleLabel.text = nil // Annuler les tâches asynchrones (par exemple, chargement d'image) cancelAsyncTask() // Réinitialiser les états (par exemple, sélection) someSwitch.isOn = false }Cela garantit qu'à la prochaine utilisation, la cellule commence dans un état propre, sans hériter de l'affichage précédent.
Il est toujours important de configurer tous les aspects de la cellule (champs de texte, images, couleurs, état sélectionné, etc.) en fonction des données du indexPath actuel, et de ne pas se fier à l'état précédent de la cellule réutilisée.