tableView之UITableViewCell重用概述

前言:作為一個(gè)iOS開發(fā)者,tableView一定是我們最常用到的一個(gè)視圖,它分為表頭(tableHeaderView)亏娜、表尾(tableFooterView)、區(qū)頭蹬挺、區(qū)尾和單元格五個(gè)部分組成维贺。其中區(qū)頭區(qū)尾的重用個(gè)人感覺理解不夠透徹,暫且不談巴帮,我只給大家講解一下我對(duì)單元格重用的理解溯泣。

概述:tableView通過重用單元格來達(dá)到節(jié)省內(nèi)存的目的:通過為每個(gè)單元格指定一個(gè)重用標(biāo)識(shí)符(Identifier),即指定了單元格的種類,以及當(dāng)單元格滾出屏幕時(shí),允許恢復(fù)單元格以便重用.對(duì)于不同種類的單元格使用不同的重用標(biāo)示符,對(duì)于簡單的表格,一個(gè)重用標(biāo)識(shí)符就夠了。通俗點(diǎn)說榕茧,tableView里面的單元格的數(shù)據(jù)過多時(shí)垃沦,如果我們每次都不停的初始化單元格,這樣會(huì)消耗很多的資源用押,直觀的感受就是滑動(dòng)單元格時(shí)界面會(huì)卡頓肢簿。tableView需要顯示的單元格終究是有限的,如果合理的利用資源這才是重用最大的價(jià)值。一般來說tableView只會(huì)創(chuàng)建屏幕所能顯示的單元格數(shù)量加一個(gè)译仗,每當(dāng)我們滑動(dòng)是就會(huì)把消失在屏幕中的單元格放到重用池(重用隊(duì)列)抬虽,然后即將展示的部分就會(huì)從重用池里面根據(jù)重用標(biāo)示符去尋找單元格,如果從重用池里面找到了可以重用的單元格就直接拿來使用纵菌,沒有找到可以重用的那就重新初始化一下獲取新的單元格阐污,單元格重用從來就不是問題,問題是我們?nèi)绾伟堰@些重用的單元格處理后看起來是不同的咱圆,你可以理解為我們事實(shí)上是在重用笛辟,但是通過數(shù)據(jù)源不同從而顯示的不同,而重用的關(guān)鍵就是通過重用標(biāo)識(shí)符去重用池里面去尋找可以重用的單元格序苏。(PS重點(diǎn):數(shù)據(jù)源和重用標(biāo)識(shí)符)

舉個(gè)栗子

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"UITableViewCell"];
    if (!cell) 
{
 1.     cell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:@"UITableViewCell"];
 }
cell.textLabel.text = @"text";

2.    [tableView registerNib:[UINib nibWithNibName:@"EvaluateHopsitalCell" bundle:nil] forCellReuseIdentifier:@"EvaluateCell"];
    EvaluateHopsitalCell * cell = [tableView dequeueReusableCellWithIdentifier:@"EvaluateCell" forIndexPath:indexPath];
cell.nameLabel.text = @"name";

return cell;
}```
正文:不管是初始化還是注冊(cè)它們的核心原理都是一樣的手幢,就是在初始化的時(shí)候用來加載所有的界面,針對(duì)第一種情況忱详,為什么我們把添加子控件 if (!cell) 這個(gè)判斷條件之外的時(shí)候會(huì)重復(fù)添加并顯示围来,這是因?yàn)閱卧裢际菑闹赜贸乩锩婺脕淼模@些控件早已存在匈睁,但我們?cè)谥赜眠@些單元格上依舊添加控件监透,最后一定是會(huì)顯示控件重復(fù)添加,而且伴隨著不斷的滑動(dòng)界面會(huì)不停的重復(fù)添加控件航唆。注冊(cè)的單元格其實(shí)也是一樣的胀蛮,如果是xib則是在Cell  的 awakeFromNib還有xib里面初始化,如果注冊(cè)的是非xib的則是在對(duì)應(yīng)的初始化方法里糯钙,我們都是在這里添加各種不同的控件和約束粪狼,但是很多人采用的方法是不停的初始化單元格,又或者是不停的刪除子空間和添加子控件的方法來達(dá)到目的任岸,如果是這樣那你滑動(dòng)的時(shí)候卡頓的問題就永遠(yuǎn)解決不了再榄,因?yàn)槟氵@樣做無疑于廢棄了重用機(jī)制,這不是我們最終目標(biāo)享潜。我們一定要在初始化的處理好界面不跟,在重用時(shí)通過indexPath從數(shù)據(jù)源里面取對(duì)應(yīng)的對(duì)象,根據(jù)不同的數(shù)據(jù)和條件賦值才是最關(guān)鍵的米碰,即便單元格是重復(fù)使用的,可是數(shù)據(jù)是不同的购城,最后展示給用戶看到的是不同的界面吕座。那么又有人會(huì)說了,那界面不同的部分該如何處理瘪板,這個(gè)一般都是通過不同的條件判斷來 展示/隱藏 控件以及修改控件約束大小來實(shí)現(xiàn)不同的需求吴趴。當(dāng)然控制好數(shù)據(jù)源也是很重要的,即便數(shù)據(jù)不是包含對(duì)象的數(shù)組侮攀,也可以通過延展把數(shù)據(jù)轉(zhuǎn)化Model的方法變成自己做需要的數(shù)據(jù)源锣枝,總之我們要盡最大可能的用一個(gè)cell來展示所有的界面厢拭。(PS重點(diǎn):初始化負(fù)責(zé)界面,重用時(shí)通過數(shù)組和indexPath獲取數(shù)據(jù)和微調(diào)界面)

題外話撇叁,tableView里面重用的不單單是cell,還有去區(qū)頭和區(qū)尾供鸠,它們的原理性的知識(shí)都是一致的,但是在一些細(xì)節(jié)性的地方是不同的陨闹。如果對(duì)tableView的區(qū)頭和區(qū)尾重用不理解的話可以參考下collectionView的區(qū)頭和區(qū)尾楞捂,它們是比較相似的,tableHeaderView和tableFooterView是不重用的趋厉,而且我們每一次刷新一個(gè)去就會(huì)同時(shí)刷新它的區(qū)頭和區(qū)尾寨闹。



最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市君账,隨后出現(xiàn)的幾起案子繁堡,更是在濱河造成了極大的恐慌,老刑警劉巖乡数,帶你破解...
    沈念sama閱讀 211,743評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件椭蹄,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡瞳脓,警方通過查閱死者的電腦和手機(jī)塑娇,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,296評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來劫侧,“玉大人埋酬,你說我怎么就攤上這事∩斩埃” “怎么了写妥?”我有些...
    開封第一講書人閱讀 157,285評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長审姓。 經(jīng)常有香客問我珍特,道長,這世上最難降的妖魔是什么魔吐? 我笑而不...
    開封第一講書人閱讀 56,485評(píng)論 1 283
  • 正文 為了忘掉前任扎筒,我火速辦了婚禮,結(jié)果婚禮上酬姆,老公的妹妹穿的比我還像新娘嗜桌。我一直安慰自己,他們只是感情好辞色,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,581評(píng)論 6 386
  • 文/花漫 我一把揭開白布骨宠。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪层亿。 梳的紋絲不亂的頭發(fā)上桦卒,一...
    開封第一講書人閱讀 49,821評(píng)論 1 290
  • 那天,我揣著相機(jī)與錄音匿又,去河邊找鬼方灾。 笑死,一個(gè)胖子當(dāng)著我的面吹牛琳省,可吹牛的內(nèi)容都是我干的迎吵。 我是一名探鬼主播,決...
    沈念sama閱讀 38,960評(píng)論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼针贬,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼击费!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起桦他,我...
    開封第一講書人閱讀 37,719評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤蔫巩,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后快压,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體圆仔,經(jīng)...
    沈念sama閱讀 44,186評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,516評(píng)論 2 327
  • 正文 我和宋清朗相戀三年蔫劣,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了坪郭。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,650評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡脉幢,死狀恐怖歪沃,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情嫌松,我是刑警寧澤沪曙,帶...
    沈念sama閱讀 34,329評(píng)論 4 330
  • 正文 年R本政府宣布,位于F島的核電站萎羔,受9級(jí)特大地震影響液走,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜贾陷,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,936評(píng)論 3 313
  • 文/蒙蒙 一缘眶、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧髓废,春花似錦巷懈、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,757評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至蒋譬,卻和暖如春割岛,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背犯助。 一陣腳步聲響...
    開封第一講書人閱讀 31,991評(píng)論 1 266
  • 我被黑心中介騙來泰國打工癣漆, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人剂买。 一個(gè)月前我還...
    沈念sama閱讀 46,370評(píng)論 2 360
  • 正文 我出身青樓惠爽,卻偏偏與公主長得像,于是被迫代替她去往敵國和親瞬哼。 傳聞我的和親對(duì)象是個(gè)殘疾皇子婚肆,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,527評(píng)論 2 349

推薦閱讀更多精彩內(nèi)容

  • 概述在iOS開發(fā)中UITableView可以說是使用最廣泛的控件,我們平時(shí)使用的軟件中到處都可以看到它的影子坐慰,類似...
    liudhkk閱讀 9,007評(píng)論 3 38
  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,777評(píng)論 25 707
  • 發(fā)現(xiàn) 關(guān)注 消息 iOS 第三方庫较性、插件、知名博客總結(jié) 作者大灰狼的小綿羊哥哥關(guān)注 2017.06.26 09:4...
    肇東周閱讀 12,065評(píng)論 4 62
  • 作者:AppCoda结胀,原文鏈接赞咙,原文日期:2015-11-16譯者:pmst;校對(duì):numbbbbb糟港;定稿:num...
    梁杰_numbbbbb閱讀 2,351評(píng)論 1 14
  • 來到了石家莊攀操,開始在網(wǎng)上投簡歷了,期待能有一個(gè)好結(jié)果秸抚,明天開始學(xué)習(xí)稅務(wù)師速和。知道自己是那種不學(xué)習(xí),考試結(jié)果就會(huì)不盡如...
    檸檬安然閱讀 127評(píng)論 0 0