Проблема dequeueReusableCell. Когда я выбираю одну ячейку, выбираются другие ячейки - PullRequest
1 голос
/ 22 января 2020

Я хочу, чтобы при выборе ячейки было добавлено другое изображение, и go возвращается к старому изображению, когда я снова щелкаю по нему. Это работает, но когда я выбираю несколько ячеек и прокручиваю вниз, он становится грязным и выбирает некоторые ячейки, которые я не выбрал. Что сбросить? Что добавить в prepareForReuse ()? Вот моя ячейка tableview:

import Foundation
import UIKit

class DownloadTableViewCell: UITableViewCell {


    @IBOutlet weak var downloadImage: UIImageView!

    @IBOutlet weak var cardSetLabel: UILabel!

    func configureCell(label: String) {
        cardSetLabel.text = label
       downloadImage.image = UIImage(named: "circle_blank")
    }
    func changeImage() {
        if(downloadImage.image == UIImage(named: "circle_download")){
            downloadImage.image = UIImage(named: "circle_blank")
            self.backgroundColor = #colorLiteral(red: 1, green: 1, blue: 1, alpha: 1)
        }
        else {
            downloadImage.image = UIImage(named: "circle_download")
            self.backgroundColor = #colorLiteral(red: 0.6000000238, green: 0.6000000238, blue: 0.6000000238, alpha: 1)
        }
    }
    override func prepareForReuse() {

        super.prepareForReuse()

           isHidden = false
           isSelected = false
           isHighlighted = false

    }
}


А вот мои методы tableView

  func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "DownloadTableViewCell", for: indexPath) as! DownloadTableViewCell       
        cell.cardSetLabel.text = cardsets[indexPath.row].title

        return cell
    }
    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
        let cell = self.tableView.cellForRow(at: indexPath) as! DownloadTableViewCell

        cell.changeImage()
//        self.tableView.indexPathsForSelectedRows?.forEach { index in
//            debugPrint("Selected rows", index.row)
//        }
        tableView.reloadData()
    }

Ответы [ 2 ]

0 голосов
/ 22 января 2020

Выпуск загруженного изображения в prepareforReuse

override func prepareForReuse() {

    super.prepareForReuse()

       isHidden = false
       isSelected = false
       isHighlighted = false
       downloadImage.image = nil

}
0 голосов
/ 22 января 2020

Вы должны сохранить состояние изображения для отображения вне ячейки, так как ячейка может быть снята с очереди. В приведенном ниже примере состояние сохраняется в свойстве cellSelectedImage . В tableView (_:, didSelectRowAt:) необходимо добавить лог c изменения изображения для данной строки и перезагрузить ячейку.

enum DownloadImage: String {
    case circle_blank, circle_download
}

class ViewController: UIViewController {

    @IBOutlet var tableView: UITableView!

    var data = Array(repeating: "Test", count: 20)
    var cellSelectedImage = Array(repeating: DownloadImage.circle_blank.rawValue, count: data.count)

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view.
    }


}

class CustomCell: UITableViewCell {

    @IBOutlet weak var downloadImage: UIImageView!

    @IBOutlet weak var cardSetLabel: UILabel!

    func configureCell(label: String, imageName: String) {
        cardSetLabel.text = label
        downloadImage.image = UIImage(named: imageName)
        if imageName == DownloadImage.circle_download.rawValue {
            self.backgroundColor = #colorLiteral(red: 0.6000000238, green: 0.6000000238, blue: 0.6000000238, alpha: 1)

        } else {
            self.backgroundColor = #colorLiteral(red: 1, green: 1, blue: 1, alpha: 1)
        }
    }
}

extension ViewController: UITableViewDataSource {

    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return data.count
    }

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "cell") as! CustomCell
        cell.configureCell(label: data[indexPath.row], imageName: cellSelectedImage[indexPath.row])
        return cell
    }

}

extension ViewController: UITableViewDelegate {
    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {

        let imgName = cellSelectedImage[indexPath.row] == DownloadImage.circle_blank.rawValue ? DownloadImage.circle_download.rawValue : DownloadImage.circle_blank.rawValue
        cellSelectedImage[indexPath.row] = imgName
        tableView.reloadRows(at: [indexPath], with: .automatic)
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...