CollectionView - 致命错误:索引超出范围 - 比视图显示的单元格多
Posted
技术标签:
【中文标题】CollectionView - 致命错误:索引超出范围 - 比视图显示的单元格多【英文标题】:CollectionView - Fatal error: index out of range - More cells than the view can show 【发布时间】:2017-10-09 14:03:37 【问题描述】:我遇到 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() 回调中替换数组的内容。 谢谢哥们!!这就是整个问题! 不客气 :) 我已添加我的评论作为答案。 【参考方案1】:您在 loadData() 调用的顶部将 cloudData
设置为一个空数组,而没有告诉集合视图重新加载。删除该行,无论如何您都将在 perform() 回调中替换数组的内容。
如果不重新加载集合视图,您将在集合视图和数据源之间创建不匹配,从而导致索引超出范围。
【讨论】:
以上是关于CollectionView - 致命错误:索引超出范围 - 比视图显示的单元格多的主要内容,如果未能解决你的问题,请参考以下文章
Swift CollectionView(致命错误:索引超出范围)
CollectionView 致命错误:在展开可选值时意外发现 nil
使用 AlamoFireImage 在 CollectionView 中使用 .af_setImage 方法加载数组 url 的致命错误