UITableView客户端分页实现异常问题咨询
解决UITableView快速滚动导致本地分页逻辑异常的问题
老哥,这个问题我太熟了!快速滚动时分页逻辑乱掉,核心原因就是willDisplayCell在快速滑动时会被多次触发——当用户飞快滑到底部,同一个(甚至多个)接近底部的单元格会反复触发这个方法,导致你的offset、page被重复累加,getMore25DataFromMainAry也会被调用N次,结果就是数据重复加载、分页计数混乱。
我给你两个关键修复步骤,彻底解决这个问题:
1. 新增「加载状态锁」,防止重复触发加载
你需要加一个布尔变量标记当前是否正在加载数据,只有在未加载时才允许触发新的加载逻辑。
第一步:定义状态变量
在你的ViewController里添加这个属性:
@property (nonatomic, assign) BOOL isLoadingMore; // 标记是否正在加载更多数据
第二步:修改willDisplayCell的触发条件
在原有判断的基础上,加上!self.isLoadingMore的限制,确保同一时间只有一次加载操作:
- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath { if(tableView == self.tblForList) { // 新增「不在加载中」的判断,避免重复触发 if (!self.isLoadingMore && indexPath.row == self.arrForList.count - 1 && self.arrForList.count < self.arrForMainList.count) { self.isLoadingMore = YES; // 上锁,标记为正在加载 self.offset += self.limit; self.page++; [self getMore25DataFromMainAry]; } } }
第三步:在加载完成后解锁
不管你的getMore25DataFromMainAry是本地截取数据还是有异步操作,都要在数据处理完成后重置isLoadingMore为NO:
- (void)getMore25DataFromMainAry { // 从主数组截取需要的分页数据 NSInteger startIndex = self.offset - self.limit; if (startIndex < 0) startIndex = 0; NSInteger endIndex = MIN(self.offset, self.arrForMainList.count); NSArray *newData = [self.arrForMainList subarrayWithRange:NSMakeRange(startIndex, endIndex - startIndex)]; // 更新列表数据源并刷新表格 [self.arrForList addObjectsFromArray:newData]; [self.tblForList reloadData]; // 加载完成,解锁 self.isLoadingMore = NO; }
2. 可选优化:调整触发时机(非必须,但体验更好)
如果想让触发时机更合理,可以把触发点提前到距离底部还有1-2个cell的位置,避免用户滑到底部才加载(尤其是数据量较大时):
// 修改触发条件为「距离底部还有2个cell时触发」 if (!self.isLoadingMore && indexPath.row >= self.arrForList.count - 2 && self.arrForList.count < self.arrForMainList.count) { // 加载逻辑... }
这样修改后,不管用户怎么快速滚动,都不会出现重复触发分页逻辑的问题了,因为每次加载都会上锁,直到本次加载完成才会允许下一次触发。
内容的提问来源于stack exchange,提问作者Drashti
相关产品推荐
相关产品推荐

