Réutiliser la cellule ne fonctionne pas bien – TableView

J'ai un problème avec le button de ma cellule. Dans ma table, chaque ligne est composée de: une image, des labels et un button. Le button a une image de coche. Quand on clique dessus, l'image du button change. Le problème est que l'image d'un autre button change aussi sans raison. Cette erreur se produit parce que ma cellule est réutilisée.

J'ai essayé d'utiliser la méthode prepareForReuse dans TableViewCell mais rien ne se passe. J'ai aussi essayé avec selectedRowAt mais je n'ai eu aucun résultat. Aidez-moi, s'il vous plaît.

Image 1:

Image 1

Image 2:

Image 2

C'est ma fonction dans ma custom Cell:

  override func prepareForReuse() { if checkStr == "uncheck"{ self.checkBook.setImage(uncheck, for: .normal) } else if checkStr == "check"{ self.checkBook.setImage(check, for: .normal) } } func isPressed(){ let uncheck = UIImage(named:"uncheck") let check = UIImage(named: "check") if self.checkBook.currentImage == uncheck{ checkStr == "check" } else self.checkBook.currentImage == check{ checkStr == "uncheck" } } 

Dans ma tableView :

  override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { let selectedCell: ListPropertyUserCell = tableView.cellForRow(at: indexPath) as! ListPropertyUserCell let uncheck = UIImage(named:"uncheck") let check = UIImage(named: "check") if selectedCell.checkBook.imageView?.image == uncheck{ selectedCell.checkStr = "check" } else if selectedCell.checkBook.imageView?.image == check{ selectedCell.checkStr = "uncheck" } } 

À partir des informations contenues dans votre message, cela ressemble à un problème de réutilisation de la cellule. Le problème est que la tableView réutilise les cellules plutôt que d'en créer de nouvelles, pour maintenir les performances. Si vous n'avez pas réinitialisé l'état de la cellule, la cellule réutilisée restra configurée dans l'ancien état.

Pour une solution rapide, vous pouvez implémenter la méthode UITableViewCell sur UITableViewCell .

Cependant, vous devrez stocker quelle cellule est 'cochée' dans votre controller de vue si vous voulez que la checkbox soit sélectionnée après avoir fait défiler la tableView. Vous pouvez le stocker vous-même ou utiliser la méthode didSelectRowAtIndexPath de didSelectRowAtIndexPath .

Essayez de le faire comme ceci:

 var checkBook = UIImageView() if self.checkBook.image == UIImage(named: "check"){ self.checkBook.image = UIImage(named: "uncheck") } else{ self.checkBook.image = UIImage(named: "check") } 

Si vous utilisez le clic sur la cellule entière, vous pouvez replace la fonction setSelected dans votre cellule personnalisée comme cela.

 override func setSelected(selected: Bool, animated: Bool) { super.setSelected(selected, animated: animated) if selected { self.checkBook.image = UIImage(named: "check") } else { self.checkBook.image = UIImage(named: "uncheck") } } 

UITableViewCell est réutilisable. Vous ne pouvez pas stocker l'état de vue dans la cellule. Vous devez configurer la cellule dans

 func tableView(UITableView, cellForRowAt: IndexPath) 

méthode de votre source de données

Le moyen le plus facile d'y parvenir est de mettre en œuvre

 func tableView(UITableView, didSelectRowAt: IndexPath) func tableView(UITableView, didDeselectRowAt: IndexPath) 

methods de UITableViewDelegate

Vous pouvez ensuite append / supprimer indexPath à un tableau dans ces methods et dans la cellule d'installation cellForRowAtIndexPath.

 func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { let cell = tableView.dequeueReusableCellWithIdentifier("YourTableViewCell") as! YourTableViewCell if array.contains(indexPath) { cell.checkBook.image = UIImage(named: "check") } else { cell.checkBook.image = UIImage(named: "uncheck") } return cell } 

Essayez mon code. Ici selectindex est utilisé pour get l'index de cellule sélectionné et selectedindex est NSMutableArray que je stocke toutes les valeurs de cellules sélectionnées.

 var selectindex : Int? var selectedindex : NSMutableArray = NSMutableArray() @IBOutlet var tableview: UITableView! func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { let cell = tableView.dequeueReusableCellWithIdentifier("LikeCell", forIndexPath: indexPath) let like: UIButton = (cell.viewWithTag(2) as! UIButton)// like button let comment: UIButton = (cell.viewWithTag(3) as! UIButton) // comment button comment.setBackgroundImage(UIImage(named: "chat.png"), forState: UIControlState.Normal) // comment button set like.addTarget(self, action: #selector(self.CloseMethod(_:event:)), forControlEvents: .TouchDown) comment.addTarget(self, action: #selector(self.CloseMethod1(_:event:)), forControlEvents: .TouchDown) return cell } // This is my like button action method. @IBAction func CloseMethod(sender: UIButton, event: AnyObject) { let touches = event.allTouches()! let touch = touches.first! let currentTouchPosition = touch.locationInView(self.tableview) let indexPath = self.tableview.indexPathForRowAtPoint(currentTouchPosition)! selectindex = indexPath.row if selectedindex.containsObject(selectindex!) { sender.setBackgroundImage(UIImage.init(named: "like (1).png"), forState: .Normal) selectedindex.removeObject(selectindex!) }else{ sender.setBackgroundImage(UIImage.init(named: "like.png"), forState: .Normal) selectedindex.addObject(selectindex!) } }