UITableVIewCell的復用問題-控件重疊與隱式覆蓋

1.1 復用機制

在我們使用UITableView 和 UICollectionView時,通常會復用cell,當需要展示的數(shù)據(jù)條較多時,只創(chuàng)建較少數(shù)量的cell 對象,一般是屏幕可顯示測Cell 數(shù)+ 1, 通過復用的方式來展示數(shù)據(jù). 這種機制不會為每一條數(shù)據(jù)都創(chuàng)建一個Cell,所以可以節(jié)省內(nèi)存,提升程序的效率和交互流暢性. 另外,在iOS 6以后,section中的Header 和Footer也能復用

復用會用到的API:


復用Cell Header Footer.png
注冊Cell Header Footer.png

復用機制不正確的使用會給我們的程序帶來很多問題
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { static NSString * CellIdentifier = @"UITableViewCell"; UITableViewCell * cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; if (!cell) { cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier]; // 偶數(shù)行 Cell 的 textLabel 的文字顏色為紅色董虱。 if (indexPath.row % 2 == 0) { [cell.textLabel setTextColor:[UIColor redColor]]; } } cell.textLabel.text = @"Title"; // 偶數(shù)行 Cell 的 detailTextLabel 顯示 Detail 文字。 if (indexPath.row % 2 == 0) { cell.detailTextLabel.text = @"Detail"; } return cell; }

我們本來只是希望只有偶數(shù)行的textLabel的文字顏色為紅色,并 且顯示Detail文字,但是當你滑動TableView的時候發(fā)現(xiàn)不對了,有些奇數(shù)行的textLabel的文字顏色為紅色,而且還顯示了Detail文字. 這種情況的出現(xiàn)就是因為/復用/,如果剛好某一個cell 沒有顯式的設置它的屬性,那么它這些屬性就直接復用別的cell. 還有一個問題就是,對偶數(shù)行的cell 的textLabel的文字顏色設置放在了初始化一個cell的if代碼塊中,這樣在復用cell的時候,因為cell != nil, 邏輯走不到這里,所以這樣也會出現(xiàn)復用問題,所以我們將cell的顏色屬性改變設置在cell != nil 的時候,放在cell復用的地方

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { static NSString * CellIdentifier = @"UITableViewCell"; UITableViewCell * cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; if (!cell) { cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier]; } cell.textLabel.text = @"Title"; if (indexPath.row % 2 == 0) { [cell.textLabel setTextColor:[UIColor redColor]]; cell.detailTextLabel.text = @"Detail"; } else { [cell.textLabel setTextColor:[UIColor blackColor]]; cell.detailTextLabel.text = nil; } return cell; }

2. 1控件重疊

在UITableViewCell的使用中,使用純代碼方式添加控件,當復用cell的時候,可能出現(xiàn)控件重疊現(xiàn)象.我們可能需要對cell中添加的控件進行清空,cell的復用不變,只是在新的cell加載前,都會對上一個cell的contentView貼的控件進行清空,代碼如下

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{ static NSString *CellIdentifer = @"DiscoverHomeInnerTableViewCell"; DiscoverHomeInnerTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifer forIndexPath:indexPath]; //TODO 解決cell復用重疊問題 for (UIView *subview in [cell.contentView subviews]) { [subview removeFromSuperview]; } UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom]; //button相關設置 [cell.contentView addSubview:button]; UILabel *lab = [[UILabel alloc] init]; //lab相關設置 [cell.contentView addSubview:lab]; }

從上面分析得知,在復用cell的時候需要注意的問題點:

  • 若要設置不同行數(shù)或者在某些條件下,不同的cell屬性(包括樣式,內(nèi)容)時,要注意不能在cell 初始化內(nèi)部中設定,要放在初始化的外部,同時用if 和else 顯式的覆蓋所有的可能性,對所有的可能性進行判斷和設定屬性;

本文的第一部分 ,有關"復用機制"的討論,引用并參考了冰晨-簡書

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末申鱼,一起剝皮案震驚了整個濱河市愤诱,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌捐友,老刑警劉巖淫半,帶你破解...
    沈念sama閱讀 222,104評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異匣砖,居然都是意外死亡科吭,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,816評論 3 399
  • 文/潘曉璐 我一進店門猴鲫,熙熙樓的掌柜王于貴愁眉苦臉地迎上來对人,“玉大人,你說我怎么就攤上這事拂共∥” “怎么了?”我有些...
    開封第一講書人閱讀 168,697評論 0 360
  • 文/不壞的土叔 我叫張陵匣缘,是天一觀的道長猖闪。 經(jīng)常有香客問我鲜棠,道長,這世上最難降的妖魔是什么培慌? 我笑而不...
    開封第一講書人閱讀 59,836評論 1 298
  • 正文 為了忘掉前任豁陆,我火速辦了婚禮,結(jié)果婚禮上吵护,老公的妹妹穿的比我還像新娘盒音。我一直安慰自己,他們只是感情好馅而,可當我...
    茶點故事閱讀 68,851評論 6 397
  • 文/花漫 我一把揭開白布祥诽。 她就那樣靜靜地躺著,像睡著了一般瓮恭。 火紅的嫁衣襯著肌膚如雪雄坪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,441評論 1 310
  • 那天屯蹦,我揣著相機與錄音维哈,去河邊找鬼。 笑死登澜,一個胖子當著我的面吹牛阔挠,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播脑蠕,決...
    沈念sama閱讀 40,992評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼购撼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了谴仙?” 一聲冷哼從身側(cè)響起迂求,我...
    開封第一講書人閱讀 39,899評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎晃跺,沒想到半個月后锁摔,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,457評論 1 318
  • 正文 獨居荒郊野嶺守林人離奇死亡哼审,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,529評論 3 341
  • 正文 我和宋清朗相戀三年谐腰,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片涩盾。...
    茶點故事閱讀 40,664評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡女仰,死狀恐怖脱盲,靈堂內(nèi)的尸體忽然破棺而出祖乳,到底是詐尸還是另有隱情指攒,我是刑警寧澤,帶...
    沈念sama閱讀 36,346評論 5 350
  • 正文 年R本政府宣布,位于F島的核電站芹枷,受9級特大地震影響衅疙,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜鸳慈,卻給世界環(huán)境...
    茶點故事閱讀 42,025評論 3 334
  • 文/蒙蒙 一饱溢、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧走芋,春花似錦绩郎、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,511評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至挖函,卻和暖如春状植,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背怨喘。 一陣腳步聲響...
    開封第一講書人閱讀 33,611評論 1 272
  • 我被黑心中介騙來泰國打工浅萧, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人哲思。 一個月前我還...
    沈念sama閱讀 49,081評論 3 377
  • 正文 我出身青樓,卻偏偏與公主長得像吩案,于是被迫代替她去往敵國和親棚赔。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,675評論 2 359

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