更新数据并重新加载CollectionView

时间:2017-06-11 21:21:22

标签: ios swift uicollectionview

我正在尝试更新保存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
}

1 个答案:

答案 0 :(得分:0)

如果要为performBatchUpdates设置更改动画,请致电collectionView。 iOS希望您调用collectionView?.insertItems(at: [IndexPath])和{}等方法 collectionView?.deleteItems(at: [IndexPath])让它知道您要插入和删除的内容,以便对其进行动画处理。对于这两个调用,您传入一个包含所有IndexPath被插入或删除的数组。

执行此操作时,iOS会对collectionView中现在的项目数量有所期望。公式是:

newItemCount = previousItemCount - deletedItemCount + insertedItemCount

在您的情况下,您修改了模型,但您从未调用过insertItemsdeleteItems方法,因此iOS仍然认为所有项目都存在。您的模型与导致您出现问题的collectionView之间存在此脱节。

要解决此问题,您需要执行以下操作之一:

  1. 使用您要删除和插入的deleteItems数组调用insertItemsIndexPath(先调用删除)。
  2. 或者,忘记performBatchUpdates,只需更新您的模型数据并致电reloadData
  3. 另外,请确保numberOfSections正在返回eventObjects.count