Изменение UICollectionViewCell в одной из нескольких ячеек в представлении коллекции - PullRequest
0 голосов
/ 17 февраля 2019

У меня есть uicollectionview с collectionviewcells, и у каждой ячейки есть логическое значение, связанное с кнопкой избранного.Существует более 50 ячеек, расположенных вертикально (четыре ячейки видны одновременно).Если нажата любимая кнопка, она переключается между выделенным изображением и невыделенным изображением.

Эта функциональность работает, но по какой-то причине, когда я нажимаю одну из них, а затем прокручиваю вниз, я вижу другие ячейки с выделенной их любимой кнопкой.Когда я прокручиваю назад вверх, кнопка избранных ячеек больше не подсвечивается.

Чего-то не хватает в этом коде?

ПРИМЕЧАНИЕ :: По умолчанию я устанавливаю логическое значение каждой ячейки в false.Это только изменилось, когда я нажимаю на любимую кнопку ячейки.

Мой код ниже:

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

    }

Ответы [ 2 ]

0 голосов
/ 17 февраля 2019

Это потому, что вы используете collectionView.dequeueReusableCell, вы должны определить массив для хранения избранного состояния каждой ячейки на нем.Это может решить вашу проблему.

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

}
0 голосов
/ 17 февраля 2019

Поскольку ячейки получают повторно, изменения влияют на несколько ячеек.Вы можете использовать метод подготовки к повторному использованию, чтобы очистить изменения, которые должны повлиять только на определенную ячейку, и Очистить ячейку и подготовить ее к повторному использованию.

override func prepareForReuse() {

     cell.isFavorite = false

    super.prepareForReuse()
}
...