UITableVIewCell的复用问题-控件重叠与隐式覆盖

1.1 复用机制

在我们使用UITableView 和 UICollectionView时,通常会复用cell,当需要展示的数据条较多时,只创建较少数量的cell 对象,一般是屏幕可显示测Cell 数+ 1, 通过复用的方式来展示数据. 这种机制不会为每一条数据都创建一个Cell,所以可以节省内存,提升程序的效率和交互流畅性. 另外,在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]; // 偶数行 Cell 的 textLabel 的文字颜色为红色。 if (indexPath.row % 2 == 0) { [cell.textLabel setTextColor:[UIColor redColor]]; } } cell.textLabel.text = @"Title"; // 偶数行 Cell 的 detailTextLabel 显示 Detail 文字。 if (indexPath.row % 2 == 0) { cell.detailTextLabel.text = @"Detail"; } return cell; }

我们本来只是希望只有偶数行的textLabel的文字颜色为红色,并 且显示Detail文字,但是当你滑动TableView的时候发现不对了,有些奇数行的textLabel的文字颜色为红色,而且还显示了Detail文字. 这种情况的出现就是因为/复用/,如果刚好某一个cell 没有显式的设置它的属性,那么它这些属性就直接复用别的cell. 还有一个问题就是,对偶数行的cell 的textLabel的文字颜色设置放在了初始化一个cell的if代码块中,这样在复用cell的时候,因为cell != nil, 逻辑走不到这里,所以这样也会出现复用问题,所以我们将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的时候,可能出现控件重叠现象.我们可能需要对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的时候需要注意的问题点:

  • 若要设置不同行数或者在某些条件下,不同的cell属性(包括样式,内容)时,要注意不能在cell 初始化内部中设定,要放在初始化的外部,同时用if 和else 显式的覆盖所有的可能性,对所有的可能性进行判断和设定属性;

本文的第一部分 ,有关"复用机制"的讨论,引用并参考了冰晨-简书

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,271评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,275评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,151评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,550评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,553评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,559评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,924评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,580评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,826评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,578评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,661评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,363评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,940评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,926评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,156评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,872评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,391评论 2 342

推荐阅读更多精彩内容