UITableView/UITableViewCell使用中犯过的错误

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; }

    推荐阅读