Переключить изображение в uicollectionviewcell при нажатии - PullRequest
0 голосов
/ 17 февраля 2019

У меня есть uicollectionview с серией пользовательских ячеек класса, которые имеют несколько текстовых представлений и uibutton.Имея более 100 ячеек, я просто хочу переключать изображение uibutton для каждой соответствующей ячейки.Uibutton - это кнопка «Избранное», и, как и большинство приложений, я просто хочу добавить в избранные и «нелюбимые» разные ячейки.

ПРИМЕЧАНИЕ. Я попытался добавить распознаватель жестов в класс напрямую, но по какой-то причинеизображение меняется, но оно выделяет несколько ячеек вместо конкретной ячейки, по которой щелкнули

мой код:

func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
        let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "cell", for: indexPath) as! SimpleExampleSubCell
        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"]
        }
        cell.bringSubview(toFront: cell.headerTextVw)
        cell.favorite_button.addGestureRecognizer(UITapGestureRecognizer(target: self, action: #selector(AddFavorite(withSender:))))
        return cell
    }


    @objc func AddFavorite(withSender sender:UIButton){
        print("clicked")
        //The line below fails each time I run it.
        sender.setImage(newImage.png,.normal)
    }

Ответы [ 2 ]

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

Вы должны установить изображение по умолчанию (плюс все, что вы хотите сбросить) для каждой ячейки в методе prepareForReuse () , чтобы он очищал повторно используемое содержимое

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

Заменить

@objc func addFavorite(withSender sender:UIButton){

на

// not recommended use touchUpInside
@objc func addFavorite(_ sender:UITapGestureRecognizer){
  let btn = sender.view! as! UIButton
}

ИЛИ лучше

cell.favorite_button.addTarget(self, action:#selector(addFavorite), for: .touchUpInside)

Не добавлять гвозди к кнопкам, поскольку они имеют своисобственные цели, такие как touchUpInside или touchUpOutside и многие другие

ячейки таблицы используются повторно, вам нужно обнулить их внутри cellForRowAt или дать еще

if someCondition { 
   cell.favorite_button.setImage(newImage1.png,.normal)
else { 
  cell.favorite_button.setImage(newImage2.png,.normal)
}
...