UITableView/UITableViewCell使用中犯过的错误

UITableView/UITableViewCell使用中犯过的错误

如果说,iOS开发过程中,哪个类用错的时候最多,很可能是UITableView和UITableViewCell

  1. 最常见的一个错误,是不使用UITableViewCell的重用机制,直接用alloc, init创建一个cell。这样效率必然是低下的。你可以试试,效果十分明显,不使用重用机制的表格绘制,闪动的厉害,重用表格的,很流畅。
 //错误的代码:

 UITableViewCell *cell = [[UITableViewCell alloc]init];

 //正确的代码:

 UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"Cell" forIndexPath:indexPath];
  1. 在使用了重用机制的情况下,在awakeFromNib方法里设置某个cell独有的内容。比如一个tableView用来显示用户的列表,如果对于用户名称的显示,用了这样的代码,那么可能会看到,有部分的用户名称显示错误(不是所有都错,可能有四五个是对的,其他是错的,因为重用机制也会创建多个同id的cell)
 //错误的代码

  - (void)awakeFromNib {

    _nameLabel.name=_user.name

 }

 //正确的代码

 -(void)setUser:(User*)user{

 _user=user;

    _nameLabel.name=_user.name

 }
  1. 对于cell高度的计算,有时候是耗时操作,所以一个解决方案是对cell的高度进行缓存,在第一次创建cell的时候,计算出cell的高度,以后直接从缓存中取。但是有时候还是容易犯错。
 _heightDict=[NSMutableDictionary new];
 ...
 MyTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"Cell" forIndexPath:indexPath];

 if( _heightDict[indexpath]==nil)

      _heightDict[indexpath]=[cell calcHeight];//NSNumber
 ...
 // 错误的代码, 这种代码在iOS8下不会出错,但是在iOS7下会有问题,因为会在创建cell之前调用,但是返回的高度因为还没有计算,所以是0,而高度是0的cell,不会去调用创建代码,所以高度永远不会计算。但是在iOS8下可能创建流程机制不同,不会出现这个问题。

 -(CGFloat)tableView:(UITableView *)tableView

 heightForRowAtIndexPath:(NSIndexPath *)indexPath{

    return [_heightDict[indexPath] floatValue];

 }
//正确的代码
-(CGFloat)tableView:(UITableView *)tableView
heightForRowAtIndexPath:(NSIndexPath *)indexPath{
    if(_heightDict[indexPath]!=nil)

     return [_heightDict[indexPath] floatValue];

 else

 return tableView.rowHeight;
 }

你可能感兴趣的:(UITableView/UITableViewCell使用中犯过的错误)