CollectionView - Fatal error: index out of range - More cells than the view can show

CollectionView - Fatal error: index out of range - More cells than the view can show

我遇到 CollectionView 致命错误:使用 UIRefreshControl 重新加载数据时索引超出范围。

集合配置如下:

override func numberOfSections(in collectionView: UICollectionView) -> Int {
    // #warning Incomplete implementation, return the number of sections
    return 1
}


override func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
    // #warning Incomplete implementation, return the number of items
    return cloudData.count
}

override func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
    let cell = collectionView.dequeueReusableCell(withReuseIdentifier: reuseIdentifier, for: indexPath) as! DataViewCell

    // Configure the cell        
    cell.cloudDataPost = cloudData[indexPath.item]
    return cell
}

重新加载数据的函数是这样的:

@objc func loadData() {
    cloudData = [CKRecord]()
    let publicData = CKContainer.default().publicCloudDatabase
    let predicate = NSPredicate(value: true)
    let query = CKQuery(recordType: "Data", predicate: predicate)
    query.sortDescriptors = [NSSortDescriptor(key: "creationDate", ascending: false)]
    publicWhisper.perform(query, inZoneWith: nil, completionHandler: { (results, error) in
        if let datos = results {
            self.cloudData = datos
            DispatchQueue.main.async {
                self.collectionView?.reloadData()
                self.refresh.endRefreshing()
            }
        }
    })
}

只要单元格数量少于视图可以显示的数量,一切都正常。使用 4 或 7 个单元格,我可以毫无问题地重新加载 de collectionView,但是当我添加另一个单元格时,导致 array.count 的单元格多于视图可以显示的单元格,我在刷新时遇到错误。

The error is this line

谢谢!

您在 loadData() 调用的顶部将 cloudData 设置为一个空数组,而没有告诉集合视图重新加载。删除该行,您将在 perform() 回调中替换数组的内容。

如果不重新加载集合视图,您就会在集合视图和数据源之间造成不匹配,从而导致索引越界。