Ячейка CollectionView, отображающая дублированные данные при прокрутке? - PullRequest
0 голосов
/ 08 апреля 2020

Я создал представление коллекции в табличном представлении для прокрутки двух измерений (горизонтальное - вертикальное). И я извлекаю данные из JSON API, все работает нормально с первой попытки, но при прокрутке вниз отображается проблема:

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

Как я могу исправить эту ситуацию? Код, подобный приведенному ниже.

Это мой основной CellView TableForRowAt:

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

    let cell = tableView.dequeueReusableCell(withIdentifier: exploreCellIDColl, for: indexPath) as! TableExploreCell

    cell.postCategory = exploreCategories?[indexPath.row]

    return cell
}

Этот объект является CollectionView cellForItemAt в TableViewCell:

// I created collection view in tableview cell
let cellCollectionView: UICollectionView = {

    let layout = UICollectionViewFlowLayout()
    layout.scrollDirection = .horizontal
    let collView = UICollectionView(frame: .zero, collectionViewLayout: layout)
    collView.backgroundColor = .clear
    return collView
}()

 // This part showing duplicated wrong data (image and text)

    func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {

    let cell = collectionView.dequeueReusableCell(withReuseIdentifier: exploreCellID, for: indexPath) as! CollectionExploreCell

           cell.postsExplore = postCategory?.post?[indexPath.row]
            self.postCategory?.post?.append(contentsOf: model.data ?? [])
            self.cellCollectionView.reloadData()

    return cell
}

1 Ответ

2 голосов
/ 08 апреля 2020

Это общая проблема, с которой сталкиваются все при просмотре коллекций и представлений таблиц. Проблема в том, что клетки перерабатываются. Когда вы вызываете dequeueReusableCell после прокрутки, вы, скорее всего, будете проходить мимо ячейки, которая только что прокручивалась за пределами экрана и содержала содержимое в своем представлении с момента последнего использования. Вы должны сделать так, чтобы ваш код cellForItemAt / cellForRowAt всегда устанавливал значение для каждого поля, независимо от данных модели.

Ваш код cellForItemAt() использует необязательную цепочку для установки только видов ячеек, если различные части вашей модели не равны нулю (знаки вопроса в postCategory?.post?[indexPath.row] и строка ниже). Вместо этого вам нужно использовать if let или какой-либо другой подход, который всегда устанавливает для каждого поля значение и устанавливает его в пустое значение, если соответствующая часть вашей модели данных равна нулю.

Также обратите внимание, что вам следует не никогда вызов reloadData() внутри cellForItemAt. Это приведет к бесконечному l oop, когда представление коллекции пытается вернуть ячейку, затем выбрасывает все ячейки и начинает загружать новые, но каждый раз, когда оно возвращает новую ячейку, отбрасывает их все снова.

...