2017-07-06 3 views
0

J'essaye de changer un UIImage dans la collectionviewcell avec l'aide de sur didSelectItemAt. Cela fonctionne lorsque je sélectionne une cellule au début, mais lorsque je défile vers le bas et que je défile vers le haut, les images sont de retour à ce qu'elles étaient et les images changées se déplacent vers des cellules différentes.UICollctionView didSelectItemAt problèmes

First cell selected Image

Scrolled down then came up Image

func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell { 
     let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "collection_cell", for: indexPath) as! RateCardCollectionViewCell 
     let tempString = "\(NSLocalizedString("base_url", comment: ""))\(itemImageLink[indexPath.row])" 
     let urlnew:String = tempString.addingPercentEncoding(withAllowedCharacters: CharacterSet.urlQueryAllowed)! 
     let url = URL(string: urlnew) 
     cell.rateCardImage.kf.setImage(with: url,placeholder: UIImage(named: "Junkart_Bin.png")) 
     cell.label.text = itemName[indexPath.row] 
     cell.itemRate.text = itemRate[indexPath.row] 
     cell.layer.cornerRadius = 3 
     cell.card.backgroundColor = UIColor.white 
     cell.card.layer.masksToBounds = false 
     cell.card.layer.shadowColor = UIColor.black.withAlphaComponent(0.2).cgColor 
     cell.card.layer.shadowOffset = CGSize(width: 0, height: 0) 
     cell.card.layer.shadowOpacity = 1 //0.8 
     return cell 
    } 

func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) { 
     let cell = collectionView.cellForItem(at: indexPath) as! RateCardCollectionViewCell 
     if self.selectedRate == nil { 
      cell.changeImagetoSelected() 
      self.selectedRate = [Int]() 
      self.selectedRate.append(indexPath.row) 
     } 
     else { 

     } 
    } 

ci-après le UICollectionViewCell classe

class RateCardCollectionViewCell: UICollectionViewCell { 


    @IBOutlet weak var label: UILabel! 
    @IBOutlet weak var rateCardImage: UIImageView! 
    @IBOutlet weak var card: UIView! 
    @IBOutlet weak var itemRate: UILabel! 
    @IBOutlet weak var selected_rate_image: UIImageView! 
    func changeImagetounSelected() { 
     selected_rate_image.image = UIImage(named: "unselected_rate") 
    } 
    func changeImagetoSelected() { 
     selected_rate_image.image = UIImage(named: "selected_rate") 
    } 
} 

S'il vous plaît aider !!

Répondre

2

Vérifiez l'indice de création cell ajouté sur la selectedRate au moment de la création de cellules cellForItemAt.

func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell { 
     let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "collection_cell", for: indexPath) as! RateCardCollectionViewCell 
     // Your remaining codes are here. 

     if selectedRate.contains(IndexPath.row) { 
      cell.changeImageToSelected() 
     } else { 
      cell.changeImageTounselected() 
     } 
     return cell 
    } 
+0

Merci. Ça m'a aidé. –

1

Cela est dû au fait que la vue de collection supprime ses cellules. Vous devez donc conserver votre sélection dans dataModel et obtenir si la cellule est sélectionnée ou non. Alors persisteront votre selectedIndex dans votre viewController et dans votre méthode cellForItemAt appel:

if(self.selectedIndex == indexPath.row){ 
    cell.changeImageToSelected() 
} 
else{ 
    cell.changeImageTounselected() 
} 

Cela persistera votre sélection lorsque défilement