简体   繁体   中英

UICollectionViewCell change in one seen in multiple cells in collectionview

I have a uicollectionview with collectionviewcells and each cell has a boolean value associated with a favorites button. There are over 50 cells positioned vertically (four cells are viewable at a time). If the favorite button is clicked it toggles between a highlighted image and a non-highlighted image.

That functionality works, but for some reason when I click one then scroll down I see other cells with their favorite button highlighted. When I scroll back up the cell favorite button is no longer highlighted.

Is there something missing from this code?

NOTE:: As a default I set each cell's boolean value to false. It's only changed when I click on the cell's favorite button.

My code below:

func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
        let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "cell", for: indexPath) as! SimpleDispensarySubCell
        cell.backgroundColor = UIColor.init(white: 0.10, alpha: 0.25)
        cell.infoLine2TextVw.text = ""
        cell.infoLine3TextVw.text = ""
        if let heading_name = self.dict_dict_holder[indexPath.item]["Name"]{
            cell.headerTextVw.text = heading_name
            cell.infoLine1TextVw.text = self.dict_dict_holder[indexPath.item]["Phone"]
        }

        if cell.isFavorite{
            cell.isFavorite = true
            cell.favorite_button.setImage(#imageLiteral(resourceName: "heart_fill_icon"), for: .normal)
        }
        else{
            cell.isFavorite = false
            cell.favorite_button.setImage(#imageLiteral(resourceName: "heart_nofill_icon"), for: .normal)
        }
        cell.bringSubview(toFront: cell.headerTextVw)
        //cell.favorite_button.addGestureRecognizer(UITapGestureRecognizer(target: self, action: #selector(AddFavorite(withSender:))))
        cell.favorite_button.addTarget(self, action:#selector(AddFavorite), for: .touchUpInside)
        return cell
    }

    @objc func AddFavorite(withSender sender:UIButton){
        let cell = sender.superview as! SimpleDispensarySubCell

        if cell.isFavorite{
            cell.isFavorite = false
            cell.favorite_button.setImage(#imageLiteral(resourceName: "heart_nofill_icon"), for: .normal)
        }
        else{
            cell.isFavorite = true
            cell.favorite_button.setImage(#imageLiteral(resourceName: "heart_fill_icon"), for: .normal)
        }

    }

It's because you are using collectionView.dequeueReusableCell you should define an array to hold favorite state of each cell on it. It could solve your problem.

let favoriteStateArray = countOfRows;

func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
    let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "cell", for: indexPath) as! SimpleDispensarySubCell
    cell.backgroundColor = UIColor.init(white: 0.10, alpha: 0.25)
    cell.infoLine2TextVw.text = ""
    cell.infoLine3TextVw.text = ""
    if let heading_name = self.dict_dict_holder[indexPath.item]["Name"]{
        cell.headerTextVw.text = heading_name
        cell.infoLine1TextVw.text = self.dict_dict_holder[indexPath.item]["Phone"]
    }

    if favoriteStateArray[indexPath.row]{
        cell.isFavorite = true
        cell.favorite_button.setImage(#imageLiteral(resourceName: "heart_fill_icon"), for: .normal)
    }
    else{
        cell.isFavorite = false
        cell.favorite_button.setImage(#imageLiteral(resourceName: "heart_nofill_icon"), for: .normal)
    }
    cell.bringSubview(toFront: cell.headerTextVw)
    //cell.favorite_button.addGestureRecognizer(UITapGestureRecognizer(target: self, action: #selector(AddFavorite(withSender:))))
    cell.favorite_button.addTarget(self, action:#selector(AddFavorite), for: .touchUpInside)
    return cell
}

@objc func AddFavorite(withSender sender:UIButton){
    let cell = sender.superview as! SimpleDispensarySubCell
    let index = collectionView.indexPath(for: cell)
    if favoriteStateArray[indexPath.row]{
        favoriteStateArray[indexPath.row] = false
        cell.favorite_button.setImage(#imageLiteral(resourceName: "heart_nofill_icon"), for: .normal)
    }
    else{
        favoriteStateArray[indexPath.row] = false
        cell.favorite_button.setImage(#imageLiteral(resourceName: "heart_fill_icon"), for: .normal)
    }

}

Since the cells are getting reused changes are affecting multiple cells. You can use prepare for reuse method to clear changes that must affect only a particular cell and Clear the cell and prepare it for Reuse.

override func prepareForReuse() {

     cell.isFavorite = false

    super.prepareForReuse()
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM