可以自己做课程的网站,德州极速网站建设 小程序,百度怎么提交网站地图,wordpress替换公共js我自己在实验中对cell的重用总结如下#xff1a;
非自定义Cell和非自定义cell的复用情况一样#xff1a;
第一次加载创建tableView的时候#xff0c;是屏幕上最多也显示几行cell就先创建几个cell#xff0c;此时复用池里什么都没有开始下滑tableView#xff0c;刚开始滑…我自己在实验中对cell的重用总结如下
非自定义Cell和非自定义cell的复用情况一样
第一次加载创建tableView的时候是屏幕上最多也显示几行cell就先创建几个cell此时复用池里什么都没有开始下滑tableView刚开始滑动时由于第一行没有完全滑出屏幕进复用池时下面的新cell已经显示到屏幕上了所以下方这个新滑出来的cell就是新创建的cell而不是复用的cell复用时也得看新加载的cell和复用池中的备用cell有没有同类型的id没有就不复用然后接着滑动第一个cell就完全出屏幕进入复用池了下面我们接着滑动接着那个需要新显示出来的cell如果和复用池中我们保存的第一个cell是同种id如果是就直接拿来复用如果不是就新创建判断是否能复用和新创建的操作都在cell的编辑函数cellForRowAtIndexPath中上滑tableView和下滑原理基本一致完全出屏幕的入复用池需要新加载到屏幕的cell先看池中有没有同id的cell有了就复用没有就创建。
下面我们讲一个使用cell时需要注意的点
复用时从复用池中取出来的cell可以是已经捆绑过数据或者加过子视图的所以如果有必要要清除数据比如(label的text和remove掉add过的子视图使用tag否则就有可能造成复用后出现显示的内容不符预期的情况比如说我们有一个开始创建id为test的cell我们在执行cell的编辑函数cellForRowAtIndexPath:中有一个判断分支符合某种情况时需要在cell上显示一个button而不符合那种情况的时候就不显示button而恰好我们这个cell符合情况于是就添加了button相关的数据然后显示出了button接着我们滑动了tableView导致我们刚才创建的这个id为test的cell进入了复用池然后再继续下滑的时候有一个新的id为test的cell需要被加载出来于是就查看了复用池发现里面有同id的cell所以就直接拿来复用了复用的时候对里面的数据进行了自己的设定本类好像没什么问题但是恰好这个新cell不符合那个要显示button的条件然后就不会去执行对button添加数据的操作我们预想着这个新cell和之前我们创建的id为test的cell的区别就是新的没有button旧的有button然后两者其他控件也就是数据内容不同比如label的text不一样这些但是实际情况却是这个新创建的cell上面显示的依然存在button和我们预想的不一致其原因就是复用时所取出来的旧cell是已经捆绑过数据且加过子视图的虽然我们新cell创建时没有走对button添加数据的代码但是由于旧cell走过了且向button添加的数据都在所以就导致新cell上面就有一个和旧cell一模一样的button。
这就是复用中可能存在的一个常见的难搞的问题但是解决起来其实也非常简单重点在于避免重用机制出错
以下有三种方法(最推荐第三种 重用机制调用的就是dequeueReusableCellWithIdentifier这个方法方法的意思就是“出列可重用的cell”因而只要将它换为cellForRowAtIndexPath只从要更新的cell的那一行取出cell就可以不使用重用机制因而问题就可以得到解决但会浪费一些空间。 为每个cell指定不同的重用标识符(reuseIdentifier)来解决。重用机制是根据相同的标识符来重用cell的标识符不同的cell不能彼此重用。
NSString *identifier [NSString stringWithFormat:TimeLineCell%d%d,indexPath.section,indexPath.row];在新cell创建走编辑函数cellForRowAtIndexPath:时在里面加一段操作去remove多余的那个子视图或者清除旧数据 而且依我本人之见最好使用清除旧数据而不是remove多余的子视图。因为这个正在新建的cell后面也许也会进入自动释放池而且它到时候也可能会被拿来复用如果那个复用它的cell刚好需要显示button而这个被复用的cell连button这个视图都没添加到cell上那直接向button添加数据时程序就会crash所以清除所有数据是不错的选择反正每次执行编辑函数cellForRowAtIndexPath:时都会为对应行组的cell重新添加那些子视图上的数据相当于覆写了旧数据我们只需要在所有的重新添加数据操作之前讲被复用的cell上子视图的数据全删了就行。 但是如果偏要走remove子视图的方法也不是不行我们可以巧妙点从复用池取出来要被复用的cell之后直接重新alloc初始化一下这个被复用的cell相当于之前清空了原本保存的所有子视图的全部数据而原本添加到cell上的子视图都还在只是没有数据不显示罢了这也是很好的手段。