解决iOS的cell复用问题
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了解决iOS的cell复用问题相关的知识,希望对你有一定的参考价值。
参考技术A 常规配置如下 当超过tableView显示的范围的时候 后面显示的内容将会和前面重复。通过以下3方案可以解决
方案一 取消cell的重用机制,通过indexPath来创建cell 将可以解决重复显示问题 不过这样做相对于大数据来说内存就比较吃紧了
方案二 让每个cell都拥有一个对应的标识 这样做也会让cell无法重用 所以也就不会是重复显示了 显示内容比较多时内存占用也是比较多的和方案一类似
方案三 只要最后一个显示的cell内容不为空,然后把它的子视图全部删除,等同于把这个cell单独出来了 然后跟新数据就可以解决重复显示
蓝懿ios微博项目之自定义cell
/重写转发微博View的get方法 懒加载,实现了转发微博view复用 // 懒加载就是在程序运行后,不是一下子加载很多的控件,而是后期需要的时候再复用 // 懒加载的形式是重写get方法的同时,里面进行判断跟着 if(obj==nil),这种形式 // 这里的转发的微博view也要考虑view的复用问题 -(LYWeiboView *)reWeiboView{
// if里面判断进行的时候要写成_reWeiboView,如果写self.reWeiboView,它属于_eWeiboView的get方法,get方法里面用属性的get方法取值判断会进入死循环,所以这里重写get方法时候一定要用_reWeiboView来判断是否存在 // 注意:_reWeiboView == nil , 整体是一个get方法, // self.reWeiboView = ,属于set方法; if (_reWeiboView == nil) { // 现创建一个,滴哦用的时候赋值时再定Fram _reWeiboView = [[LYWeiboView alloc]initWithFrame:CGRectZero]; [self addSubview:_reWeiboView]; self.reWeiboView.backgroundColor = LYGrayColor; }
return _reWeiboView; }
// ---------------------- 功能分区 ----------------------------- // [LYSinaUtils requestWeibosWithParams:params Callback:^(id obj) { // // 请求回来的数据是一个大数组 // self.weibos = obj; // // 此block是LYSinaUtils调用的方法,block里用其他对象调方法不会报错警告,如果此block方法是用tableView调用的,就会报错,报错的时候就在block方法外边用“__block”修饰一下 // [tableView reloadData]; // }];
// ---------------------- 功能分区 -----------------------------
/* // 等号右边的永远是fet方法,下面的self.params属于调用get方法,self.params.count属于set方法,一个等号左边最近的属性调用的是set方法
*/ // __block typeof(self) weakSelf = self; // __block LYHomeViewController *weakSelf = self; // *** __block这里就记住,当block里要是访问属性,可能会出现报错,直接记住在外边加上__block修饰一下就好了 //添加上拉加载和下拉刷新 在block中访问变量时 会导致内存计数+1 从而可能会引起 对象释放不掉 // __weak 和 __block 都可以使变量在block中使用时 内存计数不加1 //添加下拉刷新事件 [tableView addPullToRefreshWithActionHandler:^{
//刷新的时候如果有数据,判断当前有没有微博数据。 if (self.weibos.count>0) { // 找到微博数据数组里的第一个[0]的就是最新的用户发的微博id LYWeibo *weibo = self.weibos[0]; //获取比自己最新微博 更新微博 self.params.since_id = weibo.wid; } [LYSinaUtils requestWeibosWithParams:self.params Callback:^(id obj) { // 下面添加的时候系统不知道obj是什么,提前用数组接住 NSArray *newWeibos = obj; //把请求到的新的数据插入到数组的最前面 [self.weibos insertObjects:obj atIndexes:[NSIndexSetindexSetWithIndexesInRange:NSMakeRange(0, newWeibos.count)]]; [self.tableView reloadData];
//结束下拉刷新动画 [self.tableView.pullToRefreshView stopAnimating];
}];
}];
//添加上拉加载事件 [tableView addInfiniteScrollingWithActionHandler:^{ //如果是上拉加载 不能设置since_id不然拿不到数据 // 如设置了since_idyou参数,系统就会去请求最新的数据,而不是加载之前的数据
self.params.since_id = nil; //设置请求页数 self.params.page = @(self.params.page.intValue+1);
//上拉加载 [LYSinaUtils requestWeibosWithParams:self.params Callback:^(id obj) { //把获取到的微博数组追加到数据源数组中 [self.weibos addObjectsFromArray:obj]; [self.tableView reloadData]; //结束上拉加载动画 [self.tableView.infiniteScrollingView stopAnimating]; }];
}];
//触发下拉刷新 [self.tableView triggerPullToRefresh]; |
以上是关于解决iOS的cell复用问题的主要内容,如果未能解决你的问题,请参考以下文章
iOS tableViewCell嵌套tableview,cell刷新紊乱解决办法