解決collectionView/tableView使用deleteItemsAtIndexPaths:方法帶動(dòng)畫刪除item/cell時(shí)可能引起removeObjectAtIndex:崩潰問(wèn)題
解決方法:
參考鏈接:http://www.itdecent.cn/p/f89ee2802679
思路:通過(guò)調(diào)用collectionView或tableView的
performBatchUpdates:方法來(lái)處理刪除邏輯后,在completion block中調(diào)用reloadData:已刷新item,可防止崩潰
代碼實(shí)例:
// 官方解釋
- (void)performBatchUpdates:(void (NS_NOESCAPE ^ _Nullable)(void))updates completion:(void (^ _Nullable)(BOOL finished))completion; // allows multiple insert/delete/reload/move calls to be animated simultaneously. Nestable.
// 適用場(chǎng)景,cell的點(diǎn)擊事件通過(guò)block回調(diào)的情形,不然會(huì)造成indexPath值錯(cuò)亂,因?yàn)檎{(diào)用deleteItemsAtIndexPaths:方法時(shí),只會(huì)調(diào)用numberOfItemsInSection刷新一下item的數(shù)量,并不會(huì)調(diào)用cellForItemAtIndexPath來(lái)刷新數(shù)據(jù),(因?yàn)橹皇莿h除,item的內(nèi)容不會(huì)變,只會(huì)動(dòng)一下位置)造成崩潰。
// 解決方案:(核心代碼)
[collectionView performBatchUpdates:^{
// 首先刪除數(shù)據(jù)源
[self.dataAry removeObjectAtIndex:indexPath.row];
// 刪除item
[collectionView deleteItemsAtIndexPaths:@[indexPath]];
}completion:^(BOOL finished){
[collectionView reloadData];// reloadData 保證item indexPath的一一對(duì)應(yīng)。
}];