注意:原创版权,转载必须标明出处作者,翻版必究。。
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