UICollectionViewCells не отображается после reloadData ()

Я хочу создать представление коллекции с бесконечной прокруткой, поэтому в этом коде я добавляю 10 к количеству ячеек каждый раз, когда путь индекса равен последнему элементу ячейки, а затем перезагружаю данные в коллекции. Функция работает; Я могу прокручивать бесконечно, но если я остановлюсь, а затем прокручу немного вверх или вниз, все будет пустым. Ячейки не отображаются.

Моя теория заключается в том, что это как-то связано с dequeueReusableCellWithReuseIdentifier, и он решает отображать только те ячейки, которые в настоящее время находятся на экране.

Просмотр при прокрутке (я добавил числа в ячейки вне Xcode)

Просмотр с отсутствующими ячейками выше при небольшой прокрутке после остановки

private let reuseIdentifier = "Cell"
private var numberOfCells = 20

class CollectionViewController: UICollectionViewController {
    override func viewDidLoad() {
        super.viewDidLoad()

    }

    override func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell {
        let cell = collectionView.dequeueReusableCellWithReuseIdentifier(reuseIdentifier, forIndexPath: indexPath)

        if indexPath.row == numberOfCells - 1 {
            numberOfCells += 10
            self.collectionView?.reloadData() 
        }

        cell.contentView.backgroundColor = UIColor.blueColor()
        return cell
    }

    override func numberOfSectionsInCollectionView(collectionView: UICollectionView) -> Int {
        return 1
    }

    override func collectionView(collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
        return numberOfCells
    } 
}

person noanoanoa    schedule 27.04.2016    source источник


Ответы (3)


Звонить reloadData из cellForItemAtIndexPath - это плохо. Используйте для этого другой метод делегата, например scrollViewDidScroll.

person Alexander Doloz    schedule 27.04.2016

Я делаю аналогичные вещи в табличном представлении, и у меня это работает. Единственная разница в том, что если indexPath.row - последняя ячейка, тогда я вызываю другую функцию, которая выполняет некоторые действия (необходимые для меня), и вызываю reloadData() только в эту функцию. Попробуйте этот способ, я не уверен, но это может решить вашу проблему.

person Hardik    schedule 27.04.2016

Swift 4.2

перезагрузите его вот так.

DispatchQueue.main.async(execute: collectionView.reloadData)
person Elshad Karimov    schedule 23.05.2019
comment
Вы не должны этого делать. Хотя это решает проблему, может возникнуть другая. Ваш источник данных для представления таблицы (в данном случае numberOfCells) должен измениться одновременно в том же цикле отрисовки. В случае, если вы должны уменьшить numberOfCells, может быть цикл отрисовки до того, как ваш reloadData будет выполнен, из-за того, что он отправляется асинхронно. И представление таблицы попытается нарисовать несуществующую ячейку. - person Lord Zsolt; 10.05.2020