Изображение кнопки в tableViewCell изменяется при прокрутке в TableView - PullRequest
0 голосов
/ 19 сентября 2019

У меня проблема при прокрутке в tableView.Я реализовал закладку в проекте, и все работает отлично, кроме прокрутки.Когда он запускается в первый раз, он вызывает API, чтобы проверить, добавлен ли элемент в закладки или нет.Если в закладки, показать, что он отображает заполненное изображение, если нет, отображает не заполненное изображение.Он отлично работает, когда он загружается, в первый раз, но при прокрутке кнопки закладки изображение меняется.

Я пытался использовать prepareForReuse в CustomTableViewCell для решения проблемы, а также отображать изображение кнопки только в cellforRow, но не сработало.

Вот MainViewController:


func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

        let itemCell = tableView.dequeueReusableCell(withIdentifier: "NewPodcastTableViewCell", for: indexPath) as! NewPodcastTableViewCell

            let allMaterial = materials[indexPath.row]
            itemCell.setMaterials(materials: allMaterial)
            itemCell.delegate = self
        return itemCell
}

extension BrowseViewController: ViewBookmarkedDelegate  {

    func setBookmark( refId: String, isBookmarking: Bool, refType: String, refSubType: String) {
            let query = SetBookmarkMutation(refId: refId, refType: "material", isBookmarking: true, refSubType: refSubType)
            Apollo.shared.client.perform(mutation: query ) { results, error in
                if var bookmarked = results?.data?.bookmark {
                   print(refId,bookmarked,"onUnbookmark")            

                } else if let error = error {
                    print("Error loading data \(error)")
                }
           }
    }

    func setUnbookmark(refId: String, isBookmarking: Bool, refType: String, refSubType: String) {
            let query = SetBookmarkMutation(refId: refId, refType: "material", isBookmarking: false, refSubType: refSubType)
            Apollo.shared.client.perform(mutation: query ) { results, error in
                if var bookmarked = results?.data?.bookmark {
                    print(refId,bookmarked,"onUnbookmark")

                } else if let error = error {
                    print("Error loading data \(error)")
                }
           }
    }
}

А вот и CustomTableViewCell

protocol ViewBookmarkedDelegate {
    func setBookmark( refId: String, isBookmarking: Bool,  refType: String, refSubType: String)
    func setUnbookmark( refId: String, isBookmarking: Bool, refType: String, refSubType: String)
}

 var delegate: ViewBookmarkedDelegate?

 @IBOutlet weak var bookmarkButton: UIButton!

 @IBAction func bookmarkButtonTapped(_ sender: UIButton) {


    if (self.materials?.fragments.materialFields.bookmark?.bookmarked == false){
                self.bookmarkButton.setImage(#imageLiteral(resourceName: "bookmarkEmpty"), for: .normal)

            } else if (self.materials?.fragments.materialFields.bookmark?.bookmarked == true) {

                self.bookmarkButton.setImage(#imageLiteral(resourceName: "Bookmark Filled"), for: .normal)  
            }  

 func setMaterials(materials: GetMaterialsByTypeQuery.Data.AllMaterial) {
        self.materials = materials
    }

    override func prepareForReuse() {
        super.prepareForReuse()
        self.bookmarkButton.setImage(nil, for: .normal)
    }

Есть идеи, как решить проблему?

Заранее спасибо.

Ответы [ 4 ]

1 голос
/ 19 сентября 2019

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

0 голосов
/ 20 сентября 2019

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

0 голосов
/ 19 сентября 2019

Измените свой код настройки изображения, как показано ниже:

 self.bookmarkButton.setImage(#imageLiteral(resourceName: "Bookmark Filled"), for: .normal)
 if (self.materials?.fragments.materialFields.bookmark?.bookmarked == false){
            self.bookmarkButton.setImage(#imageLiteral(resourceName: "bookmarkEmpty"), for: .normal)

        }

Или просто удалите другое, если условие и используйте только другое условие

  if (self.materials?.fragments.materialFields.bookmark?.bookmarked == false){
            self.bookmarkButton.setImage(#imageLiteral(resourceName: "bookmarkEmpty"), for: .normal)

        } else {

            self.bookmarkButton.setImage(#imageLiteral(resourceName: "Bookmark Filled"), for: .normal)  
        }  
0 голосов
/ 19 сентября 2019

Попробуйте

func tableView (_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

    let itemCell = tableView.dequeueReusableCell(withIdentifier: "NewPodcastTableViewCell", for: indexPath) as! NewPodcastTableViewCell

        let allMaterial = materials[indexPath.row]
        itemCell.setMaterials(materials: allMaterial)
        itemCell.delegate = self

        if (allMaterial.fragments.materialFields.bookmark?.bookmarked == false){
            self.bookmarkButton.setImage(#imageLiteral(resourceName: "bookmarkEmpty"), for: .normal)

        } else if (self.materials?.fragments.materialFields.bookmark?.bookmarked == true) {

            self.bookmarkButton.setImage(#imageLiteral(resourceName: "Bookmark Filled"), for: .normal)  
        } 
    return itemCell

}

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...