iOS开发,tableView中cell的重用详解

注意:原创版权,转载必须标明出处作者,翻版必究。。

iOS中tableView是一个大的模块组件,它的重要性每个iOSCoder都是了解的。但是tableView中却有个重大的坑,就是cell的重用,每个刚接触iOS开发的人都深受其海。那么经过一段时间研究,对于重用方面希望能对大家有点帮助。

iOS系统严格控制了内存占用,所以tableView引进了重用机制。重用就是当cell数超过tableview能显示的最大数值后,进行复用之前创建过了的cell。如果不复用一直创建就容易照成内存报警。

首先是函数 ,这个函数在每一个cell将要出现的时候都会调用,注意是出现的时候。先好好理解这个函数你才能更好的理解cell的重用

-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
//这里是根据 Identifier身份ID 去cell队列里寻找cell,这里的Identifier注意是非常重要的,相同Identifier的cell会放入同一个cell队列中,这句只有在cell数超过tableview能显示的最大值时才会走。也就是能重用的时候再走。也可以理解为队列里只保持隐藏着的cell,显示中的cell是不保存的。
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"cellID"];
    if (!cell) {//这里判断Identifier所属队列里有没有cell,没有就创建cell,有就跳过不创建。这也是复用的关键步骤,这里会先创建tableview能显示的最大cell数。
        cell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"cellID"];//这里就是创建cell并且绑定Identifier,同时放入相应队列中去。
                 }
    return cell;//返回cell,显示出来。
    }

上面是一个经典例子,代码创建自定义cell
向cell中添加控件我们会有两种方式:
(1)写在IF里面,这种写法就是在cell创建的时候就定制好了cell的样式,复用的时候,控件内容跟随cell一起被复用。比如你设置了button的title,那么这个button在复用时就直接有,title也是之前设置的,复用时就不能设置了
(2)写在IF后面,这种写法就是cell复用的时候,控件不跟随复用,而是每次复用cell时,重新定制样式,重新添加控件。比如你设置添加了button的title,那么这个button在复用时就需要重新设置
注意的是,复用的cell是一个view子类。写在IF里面就是cell复用时,cell上已经有了内容不需要再添加。而写在IF后面就是复用的时候cell上没有东西,需要重新添加。

下面就是xib创建的cell进行关联。cell的Identifier已经设置好了,那么就只能放入用一个队列中进行复用。他们的样式就基本是一样的。

//XIB的关联cell(同样式)
FirstTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@“FirstTableViewCellId   (id名)"];
    if (!cell) {
      cell = [[[NSBundle mainBundle]loadNibNamed:@"FirstTableViewCell(文件名)" owner:nil options:nil]lastObject];
    }

这里的xib关联是不同样式的,为什么要这么写,你肯定会有需求,cell上有些内容不一样,比如有的cell上有这个Button,有的却没有,这样就有两种cell样式,你就必须要用两个Identifier来区别这两种样式,放入两个队列中去。
下面的写法是每个cell样式都不同,我用Identifier来区别

//XIB的关联cell(不同样式)
    HSCUTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:[NSString stringWithFormat:@"HSCUTableViewCellID%ld%ld",(long)indexPath.row,(long)indexPath.section]];(根据不同ID取不同样式cell)
    if (!cell) {
        [tableView registerNib:[UINib nibWithNibName:@"HSCUTableViewCell" 
                        bundle:nil] 
        forCellReuseIdentifier:[NSString stringWithFormat:@"HSCUTableViewCellID%ld%ld",(long)indexPath.row,(long)indexPath.section]];(绑定身份ID不同)
        cell = [tableView dequeueReusableCellWithIdentifier:[NSString stringWithFormat:@"HSCUTableViewCellID%ld%ld",(long)indexPath.row,(long)indexPath.section]];(根据不同ID取不同样式cell)
    }

总结,你在使用tableView时要注意两点,样式是否一样,用Identifier来区别,控件内容是否跟随cell一起被复用,代码写在IF里还是IF外。

如有不懂或不同意见,欢迎一起讨论。邮箱:clmd_1@163.com

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值