目錄
- 一矩乐、UITableView的適配
- 二璧函、UITableViewCell的自定義
- 三印蔬、UITableViewCell的高度處理
- 四、UITableViewCell的其他優(yōu)化
- 五脱衙、UITableViewCell的重用機(jī)制
前言
本文將按平時的技術(shù)需求程度的順序講解UITableViewCell的知識侥猬。
iOS UITableViewCell(你需要的知識點都能在這里找到)例驹。目前暫未完善,后續(xù)會補(bǔ)充完整退唠。補(bǔ)充完整時候鹃锈,此句會去掉。
一瞧预、UITableView的適配
二屎债、UITableViewCell的自定義
1、自定義UITableViewCell
其他可參考:自定義UITableViewCell(registerNib: 與 registerClass: 的區(qū)別)
xxxxxCell *cell = [tableView dequeueReusableCellWithIdentifier:kCellIdentify forIndexPath:indexPath];
①如果是[_tableView registerNib:[UINib nibWithNibName:@"xxxxxCell" bundle:nil] forCellReuseIdentifier:kCellIdentify];
獲取cell時若無可重用cell垢油,將創(chuàng)建新的cell并調(diào)用其中的awakeFromNib方法盆驹,可通過重寫這個方法添加更多頁面內(nèi)容
②如果是[_tableView registerClass:[xxxxxCell class] forCellReuseIdentifier:kCellIdentify];
獲取cell時若無可重用cell,將調(diào)用cell中的initWithStyle:withReuseableCellIdentifier:方法創(chuàng)建新的cell
三滩愁、UITableViewCell的高度處理
1躯喇、UITableViewCell的高度一定要計算嗎?或者說一定要實現(xiàn)- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
方法嗎硝枉?
答:一定要計算廉丽,但是不一定要自己計算。iOS8之后有自動計算機(jī)制妻味,需要autolayout(適用iOS8之后系統(tǒng))正压。
相關(guān)方法,請查看文章四種方法實現(xiàn)UITableView的cell高度自動計算责球。這里不再重復(fù)敘述焦履。
其他文章
UITableViewCell如何提前計算高度--含自動計算的原理
根據(jù)內(nèi)容動態(tài)計算高度的UITableViewCell--MVVM
四、UITableViewCell的其他優(yōu)化
五棕诵、UITableViewCell的重用機(jī)制
1裁良、淺談Cell的重用
所謂cell重用就是重復(fù)利用。大致的工作原理就是:UITableView屬于lazy loading校套,也就是只加載會在界面上顯示的部分价脾。舉個例子,比如說UITabeview的調(diào)試是460笛匙,咱們每個Cell的調(diào)試是230侨把,這樣的話,手機(jī)界面上最多就顯示兩個Cell妹孙,當(dāng)你向上劃動秋柄,第一個Cell一些離開界面,第三個Cell的一些出現(xiàn)在界面的時候會再創(chuàng)建第三個Cell蠢正。注意關(guān)鍵部分到了骇笔,再第二個Cell開始離開界面,第四個Cell出現(xiàn)的時候,這時候不會創(chuàng)建第四個Cell笨触,而是直接復(fù)用的第一個Cell懦傍!也就是說無論你的UITableView里有十條或者三十條數(shù)據(jù),只會創(chuàng)建三個Cell來展示這些數(shù)據(jù)芦劣!
總的來說粗俱,這種工作機(jī)制很合理,無論從CPU和內(nèi)存的角度考慮都很節(jié)省資源虚吟,但是這里有一個問題就是:這種機(jī)制是用來展示結(jié)構(gòu)一樣的數(shù)據(jù)的寸认!很多時候我們總要實現(xiàn)動態(tài)加載,總要有一個Cell串慰,與其它的Cell不同偏塞,用來顯示“正在加載中”或者“加載更多”之類的東西。這時候在Cell復(fù)用的機(jī)制下會出現(xiàn)重疊的現(xiàn)象模庐!
重用機(jī)制實現(xiàn)了數(shù)據(jù)和顯示的分離,并不會為每個要顯示的數(shù)據(jù)都創(chuàng)建一個Cell,一般情況下只創(chuàng)建屏幕可顯示的最大的cell個數(shù)+1,每當(dāng)有一個cell從屏幕消失烛愧,就將其放到緩存池中,如果有新的cell出現(xiàn)掂碱,就去緩存池中取怜姿,如果緩存池中沒有,再創(chuàng)建疼燥。
這種機(jī)制下系統(tǒng)默認(rèn)有一個可變數(shù)組NSMutableArray* visiableCells
, 用來保存當(dāng)前顯示的cell. 還有一個可變字典 NSMutableDictnery* reusableTableCells
, 用來保存可重復(fù)利用的cell. 之所以用字典是因為可重用的cell有不止一種樣式,我們需要根據(jù)它的reuseIdentifier(重用標(biāo)識符)來查找是否有可重用的該樣式的cell.