先说下踩坑的两个地方~
- (void)insertRowsAtIndexPaths:(NSArray<NSIndexPath *> *)indexPaths withRowAnimation:(UITableViewRowAnimation)animation;
- (void)deleteRowsAtIndexPaths:(NSArray<NSIndexPath *> *)indexPaths withRowAnimation:(UITableViewRowAnimation)animation;
涉及到单元格删除和插入操作的时候,一不小心crash了,排查了很久没有找到原因。最后一通神(luan)操作发现了一点头绪 Orz.
说一下原因吧:
插入和删除的过程中,并没有执行reload方法,所以每个cell对应的indexPath并没有更新。这个时候继续调用删除或者插入操作,就会出现操作错误,涉及到数组操作的话,就直接崩了~
解决方法
1. 每次执行完以后调用
- (void)reloadData;
或者
- (void)reloadRowsAtIndexPaths:(NSArray<NSIndexPath *> *)indexPaths withRowAnimation:(UITableViewRowAnimation)animation NS_AVAILABLE_IOS(3_0);
或者
- (void)reloadSections:(NSIndexSet *)sections withRowAnimation:(UITableViewRowAnimation)animation NS_AVAILABLE_IOS(3_0);
好处就是不会出错,因为每次刷新后,indexPath都是正确的;坏处嘛~ 就是会一闪闪的。看各位能不能接受咯(手动滑稽)
2.获取当前cell真正indexPath信息
讲真,一开始想到这个思路的时候脑洞有点大,大概是这样:先记录一下本次操作的row,下一次操作的时候判断操作的row是不是大于上一次操作时的row,然后巴拉巴拉~~
。。。。
不皮了,其实只需要用一个方法 :
- (nullable NSIndexPath *)indexPathForCell:(UITableViewCell *)cell;
根据cell来获取对应的indexPath就好了~
最后:希望对大家有帮助