在实际的开发过程中,我们总要去复用cell
,最好自定义cell,然后注册,那么今天来总结一下cell复用的四种方法,两个是纯代码,两个是用nib
复用
//第一中cell的复用标识
static NSString* firseCellid = @"firseCell";
//第2中cell的复用标识
static NSString* secCellid = @"secCellid";
//第3中cell的复用标识
static NSString* threeCellid = @"threeCellid";
//第4中cell的复用标识
static NSString* fourCellid = @"fourCellid";
方法一,使用纯代码,在控制器中使用registerClass
注册cell
//1.使用tableview注册cell,“registerClass”专门注册纯代码cell的
- (void)viewDidLoad {
[super viewDidLoad];
//注册firseCell
[self.tableView registerClass:[SEFirstCell class] forCellReuseIdentifier:firseCellid];
}
//2.在数据源方法中,直接“dequeueReusableCellWithIdentifier”,获取到复用的cell
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
SEFirstCell *cell = [tableView dequeueReusableCellWithIdentifier:firseCellid];
cell.textLabel.text = [NSString stringWithFormat:@"%ld",indexPath.row];
NSLog(@"%@",cell);
return cell;
}
方法2,使用纯代码,在cell中调用方法initWithStyle: reuseIdentifier:];
设置重用标识符(推荐)
//1.SESecCell.h文件中,添加一个类方法
+ (instancetype)secCellWithTableView:(UITableView *)tableView;
//2.SESecCell.m文件中,开始处理这个类方法,在cell中调用方法`initWithStyle: reuseIdentifier:];`设置重用标识符
+ (instancetype)secCellWithTableView:(UITableView *)tableView{
SESecCell *cell = [tableView dequeueReusableCellWithIdentifier:secCellid];
if (!cell) {
cell = [[SESecCell alloc] initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:secCellid];
}
return cell;
}
//在控制器中,调用cell的时候,直接使用类方法就好,非常的方便
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
SESecCell *cell = [SESecCell secCellWithTableView:tableView];
cell.textLabel.text = [NSString stringWithFormat:@"%ld",indexPath.row];
return cell;
}
方法3,使用xib,在控制器中使用registerNib注册cell
//1.使用tableview注册nib,记得使用重用标识
- (void)viewDidLoad {
[super viewDidLoad];
//注册threeCell
[self.tableView registerNib:[UINib nibWithNibName:@"SEThreeCell" bundle:nil] forCellReuseIdentifier:threeCellid];
}
//2.在数据源方法中,直接“dequeueReusableCellWithIdentifier”,获取到复用的cell(和方法一相同)
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
SEThreeCell *cell = [tableView dequeueReusableCellWithIdentifier:threeCellid];
cell.textLabel.text = [NSString stringWithFormat:@"%ld",indexPath.row];
NSLog(@"%@",cell);
return cell;
}
方法4,使用nib,在cell方法中直接注册nib (推荐)
//1.先写一个类方法
#import
@interface SEFourCell : UITableViewCell
+ (instancetype)fourCellWithTableView:(UITableView *)tableView;
@end
//2.将这个方法重写一下,加载和注册nib
+ (instancetype)fourCellWithTableView:(UITableView *)tableView{
UINib *nib = [UINib nibWithNibName:@"SEFourCell" bundle:nil];
[tableView registerNib:nib forCellReuseIdentifier:fourCellid];
SEFourCell *fourCell = [[nib instantiateWithOwner: nib options:nil] lastObject];
return fourCell;
}
//3.直接使用,已经复用了~
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
SEFourCell *cell = [SEFourCell fourCellWithTableView:tableView];
cell.textLabel.text = [NSString stringWithFormat:@"%ld",indexPath.row];
NSLog(@"%@",cell);
return cell;
}
刚才我测试了一下,就是使用nib的时候,图2中设置了
identifier
的标记,这个写不写都行,因为在代码中已经有了