UITableView
列表的特点:
- 数据量大
- 样式较为统一
- 通常需要分组
- 垂直滚动
- 通常可视区只有一个 -> 视图的复用
UITableViewDataSource
UITableView作为视图,只负责展示,协助管理,不管理数据
需要开发者为UITableView提供展示所需要的数据及Cell
通过delegate的模式,开发者需要实现UITableViewDataSource
@require
numberOfRowsInSection:(NSInteger)section;
cellForRowAtIndexPath:(NSIndexPath *)indexPath;
UITableViewCell默认提供的样式
都是常用的cell布局
UITableViewCell的复用及其原理
//每当滚动tableView有cell要进入可视区时,系统都会自动回调此dataSource方法
- (nonnull UITableViewCell *)tableView:(nonnull UITableView *)tableView cellForRowAtIndexPath:(nonnull NSIndexPath *)indexPath {UITableViewCell* cell = [tableView dequeueReusableCellWithIdentifier: @"id"];if (!cell) {cell = [[UITableViewCell alloc] initWithStyle: UITableViewCellStyleSubtitle reuseIdentifier: @"id"];count++;}cell.textLabel.text = [NSString stringWithFormat: @"主标题 - %@", @(indexPath.row)];cell.detailTextLabel.text = @"副标题";cell.imageView.image = [UIImage imageNamed: @"image.png"];return cell;
}- (NSInteger)tableView:(nonnull UITableView *)tableView numberOfRowsInSection:(NSInteger)section {return 66;
}
当你需要66个cell来展示数据时,而可视区至多显示13个cell,开始cell为空,系统会先创建13个cell并设置自定义的id
做标记,滑动tableView,滑出可视区的cell系统会将其放入cell回收池,划入可视区的cell是根据id
从回收池取出的同类型的cell来进行复用
因此本质上系统只需创建了13个cell,这样极大地减少了内存消耗,提高了程序性能
以上是cell复用的方法需要对cell进行判空,接下来介绍一种不需要判空的方法——cell的注册机制
// 在viewDidLoad初始化方法中进行注册
[tableView registerClass:[UITableViewCell class] forCellReuseIdentifier:@"id"];// 在dataSource协议方法中获取已注册的单元格cell
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"id" forIndexPath:indexPath];
在使用注册机制后,就可以在dataSource方法中通过标识符快速复用已注册的cell,而且在cell为空时会自动利用注册cell时提供的类创建一个新的cell并返回,而无需手动创建和管理每个cell实例
自定义Cell
【iOS】自定义Cell
demo
UITableViewDemo on GitHub