1. 程式人生 > >iOS開發經驗分享:UITableViewCell復用問題

iOS開發經驗分享:UITableViewCell復用問題

owa 添加 gre 現在 ack ret container con ext

  很多朋友覺得UITableViewCell復用問題很難處理,百思不得其解,甚至有很多朋友自己琢磨很久也不明白個究竟。現在分享一下個人的一些經驗,希望對大家有幫助,如果有好的意見或者有不同的看法也可以提出來,讓我們一起分享一起進步,知識只有在分享的情況下才能實現它的最大價值。好了,廢話少說,直奔主題了。列舉兩個場景對比一下,也許tableviewcell的復用就很清晰明了了。本文來自於無限互聯的學員。

  例1:

  - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{

  static NSString *CellIdentifier = @"cell1";

  UITableViewCell *cell =[tableView dequeueReusableCellWithIdentifier:CellIdentifier];

  if (cell == nil) {

  cell = [UITableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];

  UILabel *labelTest = [UILabel alloc]init];

  [labelTest setFrame:CGRectMake(2, 2, 80, 40)];

  [labelTest setBackgroundColor:[UIColor clearColor];

  [labelTest setTag:1];

  [cell contentView]addSubview:labelTest];

  }

  UILabel *label1 = (UILabel*)[cell viewWithTag:1];

  [label1 setText:[self.tests objectAtIndex:indexPath.row];

  return cell;

  }

  例2:

  - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath*)indexPath{

  static NSString *CellIdentifier = @"cell1";

  UITableViewCell *cell =[tableView dequeueReusableCellWithIdentifier:CellIdentifier];

  if (cell == nil) {

  cell = [UITableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];

  }

  UILabel *labelTest = [UILabel alloc]init];

  [labelTest setFrame:CGRectMake(2, 2, 80, 40)];

  [labelTest setBackgroundColor:[UIColor clearColor]; //之所以這裏背景設為透明,就是為了後面讓大家看到cell上疊加的label。

  [labelTest setTag:1];

  [cell contentView]addSubview:labelTest];

  [labelTest setText:[self.tests objectAtIndex:indexPath.row];

  return cell;

  }

  當你上下來回滑動tableview的時候就會看到區別,第一種程序界面不會出現異常,但是第二種就不是了,會出現字體疊加現象,其實更確切的是多個label的疊加。為什麽呢,因為在tableview刷新的時候,如果那個位置已經有現成的cell,它就不會再重新請求資源生成新的cell了,而是復用原來的cell。所以對於對於第一種,代碼的思路是第一次在cell不存在的時候生成cell,定義cell樣式,以後不管是刷新還是重新請求還好,它都只是復用已生成的cell。而第二種思路是,在cell不存在的時候,請求生成cell,然後給cell上添加label,刷新的時候,會復用已有的cell,但是會重復添加label,故造成重疊的現象。

  之前類似的問題來回困擾了我好多次,我都沒有下決心徹底搞清楚,每次都是得過且過,只要程序最好調好了,就OK。今天又碰到了類似的問題,終於大致搞清楚了,希望以後不會再被它坑害。

  上面分享的是個人的心得,希望大家有好的知識,有幹貨也分享出來,讓我們一起學習,一起進步。當然,希望我分享的這些小知識能夠幫助到大家,幫助到大家是我最大的滿足。作者信息:師從無限互聯陳為老師

iOS開發經驗分享:UITableViewCell復用問題