关于下拉刷新引起的崩溃问题

项目有个需求是分页的,在table的最后一个cell的点击效果是点击添加一条数据,本来挺简单的一个问题结果遇到个crash bug,,,郁闷了好几个小时,,在这里总结一下。

if (indexPath.row<listArr.count) {BuyListInfoCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:BUYLIST_INFO_CELL forIndexPath:indexPath];}

if(indexPath.row==listArr.count){BuyListAddCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:BUYLIST_ADD_CELL forIndexPath:indexPath];      }  else return nil

在datasource中返回cell的方法中我是这么添加cell的逻辑的在下拉刷新的时候会出现一些问题

在下拉刷新的时候会先调用reloadData方法,如果下拉的距离超过了一个cell的高度,在重用机制的情况下回滚的时候会再次调用

- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath

这个代理方法,但是

- (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section

cell数量返回的代理却不会被调用也就是说数组的数据被清空了但是实际上table的cell数量却没有刷新,,导致了在cell的返回中返回了nil所以引起了crash。

解决方法,一种是在remove掉数组数据之后进行一次tableview reloadData确保行数的正确返回,另一种是通过一个NSInteger类型的标记作为逻辑计算方式进行逻辑判断,最后一种就是不返回Nil在else的情况下也添加一个逻辑这样崩溃的问题就解决掉了。

这种类型的问题一般比较坑爹。。。因为可能有的手机会发生crash有的手机却没事儿,导致原因比较难找。

推荐阅读更多精彩内容

  • UITableViewCell 高度计算 UITableView 询问 cell 高度有两种方式:1.rowHei...
    WeiHing阅读 3,937评论 6 15
  • iOS网络架构讨论梳理整理中。。。 其实如果没有APIManager这一层是没法使用delegate的,毕竟多个单...
    yhtang阅读 4,619评论 1 23
  • *面试心声:其实这些题本人都没怎么背,但是在上海 两周半 面了大约10家 收到差不多3个offer,总结起来就是把...
    Dove_iOS阅读 25,874评论 30 469
  • 前言 由于最近两个多月,笔者正和小伙伴们忙于对公司新项目的开发,笔者主要负责项目整体架构的搭建以及功能模块的分工。...
    CoderMikeHe阅读 25,473评论 74 262
  • 作者si1ence2016.05.20 10:24* http://www.jianshu.com/p/bc3f8...
    Kiddz阅读 845评论 0 12
  • 菊花黄,三载始还乡。儿时亭台默然在,瓦松落叶掩回廊。举目顿觉伤。 循酒香,池上旧书房。横卧纸墨花掩身,不堪为伊憔悴...
    榎木津雪绘阅读 107评论 0 0
  • 早餐准备了以后,因为要早点去实习,急匆匆的吃了紫薯。豆子。三明治现在才开始吃。饿了诶 今天的午餐有蒸茄子。苦菊。豆...
    阳光甚好_e596阅读 111评论 0 0
  • 黑夜里,一只黑猫正在屋脊上慢步行走,走着有着,不见了它的踪影…… 这屋子里面是个灵堂! 灵堂的正中摆放着一...
    Mr迟阅读 191评论 1 1