解决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方法

     [email protected](3);

     

     */

    //    __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刷新紊乱解决办法

iOS 防止UICollectionViewCell复用的两种方法

蓝懿ios微博项目之自定义cell

关于UITableView复用问题的3种解决方法

iOS tableview和 Collection复用机制

有关UITableView--cell复用问题