先说一句题外话,Apple官方建议不要在scrollview中嵌套scrollview。tableview也是scrollview的一种,不到万不得已时不要将它嵌到scrollview中。我们回到正题,UITableView是很高效的,与它的cell复用机制密不可分。cell复用指的是什么呢?通俗地说一下。假设我们的tableview中有10个cell,窗口只容得下前5个,每个cell都是一样的,复用id也一样。从初始位置开始慢镜头,把cell前上滑动一点点,此时第一个cell的一部分消失了,第五个cell露出了一部分,这时第一个cell并没有进入到复用池,池子是空的,第五个cell自然也就不能在复用池中找到可复用的cell,第五个cell执行了如下代码:
通过调试跟踪可以看到程序走到了if里面去。
当第五个cell完全显示出来,第一个cell也已经完全退出了窗口,这时第一个cell被放入到复用池。我们继续向上滑动,第六个cell将显示出来,它也要走上面的那段代码,但是它不会进入到if里面去,因为第一个cell已经在复用池中了,第六个cell可以复用第一个cell,而不需重新创建对象。
有时为了解决一些cell内容无法刷新的问题,我省去了cell复用的常规写法,每次都是建立一个新的cell,即去掉上面那段代码中if的部分。
这个cell中装个一个登录按钮,用户登录状态下按钮显示“退出登录”,用户未登录状态下按钮显示“登录”,在按钮响应事件处理方法中对按钮的标题_btnForLoginTitle进行变换,然后执行[_tableViewreloadData];以使这个cell中按钮文字相应改变。结果是如果复用cell则按钮文字不能及时改变,每次创建新的cell则可解决问题,于是便投机取巧了。