UITableViewCell的创建方式


最常用的方式
iOS6之前,cell的复用使用方法

- (UITableViewCell *)dequeueReusableCellWithIdentifier:(NSString *)identifier;

所以常用如下方式创建cell,纯代码示例:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    static NSString *reuseIdentifier = @"cell";
    // 根据标识去缓存池找cell
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:ID];
  // 不写这句直接崩掉,找不到循环引用的cell  
   if (cell == nil) {
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:ID];
   }   
    cell.textLabel.text = @"123";
    return cell;
}

使用Xib的复用方式示例:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *identifier = @"cell";
    ZCTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:identifier];
    if(!cell)
    {
        cell = [[[NSBundle mainBundle] loadNibNamed:@"ZCTableViewCell" owner:self options:nil] firstObject];
    }
    [cell setupCell];
    return cell;
}

iOS6之后的方法
iOS6提供了新的复用方法

- (UITableViewCell *)dequeueReusableCellWithIdentifier:(NSString *)identifier forIndexPath:(NSIndexPath *)indexPath;

需要配合如下方法使用:

//从XIB中注册cell
- (void)registerNib:(nullable UINib *)nib forCellReuseIdentifier:(NSString *)identifier

//根据class注册cell
- (void)registerClass:(nullable Class)cellClass forCellReuseIdentifier:(NSString *)identifier

iOS6之前不带indexPath的复用方法也可以配合上述方法使用

使用方式:

  1. 在tableView中注册cell,xib布局的cell使用registerNib方法,纯代码则使用registerClass方法
  2. 在cellForRow方法中使用获取复用cell的方法

registerNib示例:

- (void)configureTableView {
    _tableView = [[UITableView alloc] initWithFrame:self.view.bounds style:UITableViewStylePlain];
    _tableView.delegate = self;
    _tableView.dataSource = self;
    UINib *nib = [UINib nibWithNibName:NSStringFromClass([HZCTableViewCell class]) bundle:nil];
    [_tableView registerNib:nib forCellReuseIdentifier:ReuseIdentifier];
    [self.view addSubview:_tableView];
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    HZCTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:ReuseIdentifier forIndexPath:indexPath];
    return cell;
}

使用dequeueReusableCellWithIdentifier:forIndexPath:复用cell的问题:

  1. registerNib后,获取重用的cell,如果没有重用的cell,将自动使用提供的nib文件创建cell,调用其中的awakeFromNib方法并返回,
  2. registerClass后,获取重用cell,如果没有重用的cell,将自动使用提供的class类调用它的initWithStyle:withReuseableCellIdentifier:方法创建新的cell并返回

如果使用dequeueReusableCellWithIdentifier:则需要判断返回的是否为空

另外要注意的:
1、dequeueReuseableCellWithIdentifier:与dequeueReuseableCellWithIdentifier:forIndexPath:的区别:
前者不必向tableView注册cell的Identifier,但需要判断获取的cell是否为nil;
后者则必须向table注册cell,可省略判断获取的cell是否为空,因为无可复用cell时runtime将使用注册时提供的资源去新建一个cell并返回

2、自定义cell时,记得将其他内容加到self.contentView 上,而不是直接添加到 cell 本身上

总结:

  1. 自定义cell时,
  • 若使用nib,使用 registerNib: 注册,dequeue时会调用 cell 的 -(void)awakeFromNib
  • 不使用nib,使用 registerClass: 注册, dequeue时会调用 cell 的 - (id)initWithStyle:withReuseableCellIdentifier:
  1. 需不需要注册?
  • 使用dequeueReuseableCellWithIdentifier:可不注册,但是必须对获取回来的cell进行判断是否为空,若空则手动创建新的cell;
  • 使用dequeueReuseableCellWithIdentifier:forIndexPath:必须注册,但返回的cell可省略空值判断的步骤。

UITableView的两种重用Cell方法的区别
自定义UITableViewCell(registerNib: 与 registerClass: 的区别)

你可能感兴趣的:(UITableViewCell的创建方式)