我正在尝试更新保存collectionView数据的数据对象(只是过滤数据模型),并希望使用过滤后的数据重新加载collectionView。问题是在重新加载我正在获取的collectionView并且在重新加载发生时错误indexPath超出范围。似乎在调试时,collectionView正在尝试重新加载原始dataObject,而不是已过滤的dataObject。我做错了什么:
func handleFilterAction(sender: FilterButton){
guard let type = sender.buttonFilterType else {return}
switch type {
case .FilterAll:
return
case .FilterDay:
return
case .FillterWeek:
return
case .FilterMonth:
collectionView?.performBatchUpdates({
let objects = FilterDataManager.filterDataWith(currentLocalData: &self.eventObjects, filterOption: .ThisMonth)
self.eventObjects.removeAll()
self.eventObjects = objects
}, completion: { (completion) in
self.navigationItem.title = "This Month"
self.collectionView?.reloadData()
})
}
self.handleShowFilterView()
}
eventObjects是collectionView应该为数据读取的内容:
override func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
return eventObjects[section].sectionObjects.count
}
答案 0 :(得分:0)
如果要为performBatchUpdates
设置更改动画,请致电collectionView
。 iOS希望您调用collectionView?.insertItems(at: [IndexPath])
和{}等方法
collectionView?.deleteItems(at: [IndexPath])
让它知道您要插入和删除的内容,以便对其进行动画处理。对于这两个调用,您传入一个包含所有IndexPath
被插入或删除的数组。
执行此操作时,iOS会对collectionView
中现在的项目数量有所期望。公式是:
newItemCount = previousItemCount - deletedItemCount + insertedItemCount
在您的情况下,您修改了模型,但您从未调用过insertItems
和deleteItems
方法,因此iOS仍然认为所有项目都存在。您的模型与导致您出现问题的collectionView
之间存在此脱节。
要解决此问题,您需要执行以下操作之一:
deleteItems
数组调用insertItems
和IndexPath
(先调用删除)。performBatchUpdates
,只需更新您的模型数据并致电reloadData
。另外,请确保numberOfSections
正在返回eventObjects.count
。