UITableViewCell的重用机制及注册方法

  • 重用机制

    重用机制实现了数据和显示的分离,并不为每个数据创建一个UITableViewCell,只创建屏幕可显示的最大的cell个数+1(这个“1”是uitableview第一次滑动第一个cell进入reusableTableCells过程中出现的),然后去循环重复使用这些cell,既节省空间,又达到需要显示的效果.
    重用机制主要用到了一个可变数组(NSMutableArray* visiableCells)和一个可变的字典(NSMutableDictnery* reusableTableCells)。visiableCells,用来保存屏幕显示的cell。reusableTableCells,用来保存可重复利用的cell.(之所以用字典是因为可重用的cell有不止一种样式,我们需要根据它的reuseIdentifier,也就是所谓的重用标示符来查找是否有可重用的该样式的cell).

  • UITableView重用的几种写法

1、免注册方式

static NSString *cellID = @"cell";
//根据identifier在缓存的字典中找是否有已经初始化好的cell,如果没有就新建
UITableView *cell = [tableView dequeueReusableCellWithIdentifier:cellID];
if (!cell) {
     cell = [[HORTransitReportCell alloc] initWithStyle:UITableViewCellStyleValue2 reuseIdentifier:cellID];
}
return cell;

2、注册方式

2.1、现在viewDidLoad进行cell注册

[self.tableView registerClass:[UITableViewCell class] forCellReuseIdentifier: identifier];

2.2、cellForRowAtIndexPath 创建

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    // 从重用队列中取cell 由于viewDidLoad中已经注册过cell,系统会自动做判断,不用再次手动判断单元格是否存在
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier: identifier forIndexPath:indexPath] ;
    return cell ;
}

  • 自定义cell,且cell高度可变

因为cell高度随机,所以应保证identifer也是单一的,不去进行复用,保证每一个cell有唯一的identifer。

static NSString *cellID = [NSString format@"cell%ld%ld",indexPath.section,indexPath.row];
//根据identify在缓存的字典中找是否有已经初始化好的cell
UITableView *cell = [tableView dequeueReusableCellWithIdentifier:cellID];
if (!cell) {
     cell = [[HORTransitReportCell alloc] initWithStyle:UITableViewCellStyleValue2 reuseIdentifier:cellID];
}
return cell;
  • UITableviewCell注册和不注册两种情况获取cell的的用法

1、免注册方法

- (nullable __kindof UITableViewCell *)dequeueReusableCellWithIdentifier:(NSString *)identifier; 
// Used by the delegate to acquire an already allocated cell, in lieu of allocating a new one.
(返回给代理一个已经分配的cell,代替一个新的cell,如果没有已分配的cell,则返回nil,使用这个方法就不需要注册了)

2、注册方法

- (__kindof UITableViewCell *)dequeueReusableCellWithIdentifier:(NSString *)identifier forIndexPath:(NSIndexPath *)indexPath NS_AVAILABLE_IOS(6_0); 
// newer dequeue method guarantees a cell is returned and resized properly, assuming identifier is registered  
如果cell的identifier是注册过的,那么这个新列出的方法保证返回一个cell (有分配的就返回已分配的cell,没有返回新的cell)并适当调整大小,可省略cell空值判断步骤,用这个方法cell必须注册,不是自定义的cell,UITableViewCell也要注册

你可能感兴趣的:(UITableViewCell的重用机制及注册方法)