UITableView的cell重用优化
三种情况,四种方法:
情况一:加载xib中描述的cell
情况二:加载纯代码自定义的cell
情况三:加载storyBoard中的tableView内的cell
针对于情况一:
// 导入自定义cell的.h文件,在viewDidLoad方法中注册xib中描述的cell,因为只需要注册一次,所以选择在viewDidLoad方法中注册 #import "WSUserCell.h" - (void)viewDidLoad { [self.tableView registerNib:[UINib nibWithNibName:NSStringFromClass([WSUserCell class]) bundle:nil] forCellReuseIdentifier:WSUserCellId]; }
针对于情况二:
// 方法一: - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { static NSString *ID = @"carID"; UITableViewCell *carCell = [tableView dequeueReusableCellWithIdentifier:ID]; if (carCell == nil) { carCell =[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:ID]; } WSCarGroups *carGroup = self.arrayModel[indexPath.section]; WSCars *car = carGroup.cars[indexPath.row]; carCell.textLabel.text = car.carName; carCell.imageView.image = [UIImage imageNamed:car.carIcon]; return carCell; }
// 方法二: - (void)viewDidLoad { // 注册 [self.tableView registerClass:[UITableViewCell class] forCellReuseIdentifier:ID]; } - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { static NSString *ID = @"carID"; UITableViewCell *carCell = [tableView dequeueReusableCellWithIdentifier:ID];
// 因为已经注册过这个cell类,所以就不用写这句代码 // if (carCell == nil) { // carCell =[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:ID]; // } WSCarGroups *carGroup = self.arrayModel[indexPath.section]; WSCars *car = carGroup.cars[indexPath.row]; carCell.textLabel.text = car.carName; carCell.imageView.image = [UIImage imageNamed:car.carIcon]; return carCell; }
针对于情况三:
即不需要注册,也不需要在- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath中判断cell是否为空,系统会自动加载storyBoard中指定reuseIdentifier的cell
- (void)viewDidLoad { [super viewDidLoad]; self.tableView.rowHeight = 70; // 千万不要注册,因为注册的优先级大于storyBoard,一旦注册就不会加载storyBoard中的cell // [self.tableView registerClass:[UITableViewCell class] forCellReuseIdentifier:@"tg"]; } - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { if (indexPath.row % 2 == 0) { static NSString *ID = @"tg"; XMGTgCell *cell = [tableView dequeueReusableCellWithIdentifier:ID]; cell.tg = self.tgs[indexPath.row]; return cell; } else { return [tableView dequeueReusableCellWithIdentifier:@"test"]; } }
如下图,为storyBoard中给cell绑定的reuseIdentifier: