我遇到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个单元格,我可以毫无问题地重新加载集合视图,但当我添加另一个单元格时,导致array.count的单元格数超过了视图显示的单元格数,我在刷新时出错。
错误是这条线
谢谢!
您在loadData()调用的顶部将cloudData
设置为一个空数组,而不告诉集合视图重新加载。删除这一行,您将在perform()回调中替换数组的内容。
如果不重新加载集合视图,您将在集合视图和数据源之间创建不匹配,从而导致索引越界。