【iOS】自定义cell及其复用机制

文章目录四、cell的复用原理五、自定义cell总结
前言
iOS的自定义cell是我们在App开发中最常用到的一个控件,接下来笔者将从其结构以及复用机制等方面对其展开论述 。
一、协议
我们要使用自定义cell或是前,需要实现两个协议:
通过查看源码得知:
主要用于显示单元格、设置单元格的行高与对指定的单元格进行操作以及设置头视图与脚视图
e主要用于设置的与row的数量
二、cell的复用方式
首先我们先来看一下cell的两种复用方式:
注册:
- (void)viewDidLoad {[super viewDidLoad];// 如果使用 Nib 自定义 Cell[self.tableView registerNib:[UINib nibWithNibName:@"CustomCell" bundle:nil] forCellReuseIdentifier:@"myCell"];// 如果使用代码自定义 Cell[self.tableView registerClass:[CustomCell class] forCellReuseIdentifier:@"myCell"];}- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {static NSString *identifier = @"mycell";UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:identifier forIndexPath:indexPath];// Configure the cell......return cell;}
非注册:
- (void)viewDidLoad{[super viewDidLoad];}- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {static NSString *identifier = @"mycell";UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:identifier];if (!cell) {cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:identifier];}// Configure the cell......return cell;}
三、两种复用方式的区别 区别1
上述代码的区别在于注册方法需要提前对我们要使用的cell类进行注册,如此一来就不需要在后续过程中对我们的单元格进行判空 。
这是因为我们的注册方法:
- (void):( Class) er:( *) (ios(6.0));

【iOS】自定义cell及其复用机制

文章插图
在调用过程中会自动返回一个单元格实例,如此一来我们就避免了判空操作
对注释进行翻译:
//从iOS 6开始,客户端可以为每个单元格注册一个类 。
//如果所有重用标识符都已注册,请使用更新的-::来保证返回一个单元实例 。
//从新的出列方法返回的实例在返回时也将具有适当的大小 。
区别2
我们可以注意到在获取 Cell 时,两种方式调用了不同的 :
- (nullable __kindof UITableViewCell *)dequeueReusableCellWithIdentifier:(NSString *)identifier;// Used by the delegate to acquire an already allocated cell, in lieu of allocating a new one.- (__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
这里直接给出结论:
第一个用在了非注册的方式里,第二个用在了需要注册的方式里 。经过验证,第一个也可以用在注册的方式里,但是第二个如果用于非注册的方式,则会报错崩溃:
这里的原理笔者没有找到相关回答讲解,但是通过询问得到了一个解答,但并不能保证其是否正确
通过查看代码得知 :
static NSString *identifier = @"mycell";UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:identifier];if (!cell) {cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:identifier];}// Configure t
在我们非注册的方法中我们的cell确实没有在使用该方法前注册重用标识符