先說一句題外話,Apple官方建議不要在scrollview中嵌套scrollview。tableview也是scrollview的一種,不到萬不得已時(shí)不要將它嵌到scrollview中。我們回到正題,UITableView是很高效的,與它的cell復(fù)用機(jī)制密不可分。cell復(fù)用指的是什么呢?通俗地說一下。假設(shè)我們的tableview中有10個(gè)cell,窗口只容得下前5個(gè),每個(gè)cell都是一樣的,復(fù)用id也一樣。從初始位置開始慢鏡頭,把cell前上滑動(dòng)一點(diǎn)點(diǎn),此時(shí)第一個(gè)cell的一部分消失了,第五個(gè)cell露出了一部分,這時(shí)第一個(gè)cell并沒有進(jìn)入到復(fù)用池,池子是空的,第五個(gè)cell自然也就不能在復(fù)用池中找到可復(fù)用的cell,第五個(gè)cell執(zhí)行了如下代碼:

通過調(diào)試跟蹤可以看到程序走到了if里面去。
當(dāng)?shù)谖鍌€(gè)cell完全顯示出來,第一個(gè)cell也已經(jīng)完全退出了窗口,這時(shí)第一個(gè)cell被放入到復(fù)用池。我們繼續(xù)向上滑動(dòng),第六個(gè)cell將顯示出來,它也要走上面的那段代碼,但是它不會(huì)進(jìn)入到if里面去,因?yàn)榈谝粋€(gè)cell已經(jīng)在復(fù)用池中了,第六個(gè)cell可以復(fù)用第一個(gè)cell,而不需重新創(chuàng)建對(duì)象。
有時(shí)為了解決一些cell內(nèi)容無法刷新的問題,我省去了cell復(fù)用的常規(guī)寫法,每次都是建立一個(gè)新的cell,即去掉上面那段代碼中if的部分。

這個(gè)cell中裝個(gè)一個(gè)登錄按鈕,用戶登錄狀態(tài)下按鈕顯示“退出登錄”,用戶未登錄狀態(tài)下按鈕顯示“登錄”,在按鈕響應(yīng)事件處理方法中對(duì)按鈕的標(biāo)題_btnForLoginTitle進(jìn)行變換,然后執(zhí)行[_tableViewreloadData];以使這個(gè)cell中按鈕文字相應(yīng)改變。結(jié)果是如果復(fù)用cell則按鈕文字不能及時(shí)改變,每次創(chuàng)建新的cell則可解決問題,于是便投機(jī)取巧了。