02-tableView简介
概念
非常非常常用,没有tableView基本就不能叫应用
支持垂直滚动
以行为单位显示,每行显示一个 cell (单元格)
每一个 cell 都是一个 UITableViewCell 对象
自定义 UITableViewCell 能够表现非常丰富的界面展现
UITableView 的性能优化是目前面试中被问及频率颇高的问题
UITableView 内置了复用机制,实现性能优化
有两种样式(留个印象)
小结
一行(row) 一个 Cell,垂直滚动
Cell 可以定制
要满足快速滚动,表格的性能很重要
有一个 复用机制
两种样式
03-tableView显示数据的模式
dataSource 提供数据的对象,显示的内容
delegate 监听事件(选中,滚动到某一行)
系统提供了tableView的垂直滚动,可以以行的形式显示,可以选中等等.但本身并不知道显示的内容,需要另外一个对象(vc)通过数据源提供
tableView:
总共有多少组
每一组有多少行
每个组/行现实的内容
vc:
告诉tableView有多少组
告诉tableView每一组有多少行
告诉tableView每个组/行现实的内容
04-数据源方法调用顺序
1.首先要知道有几个组
2.如果有组,判断每一组有多少行
3.如果没有行数,不会调用内容
4.如果有行数才会调用内容,并且不能返回为空,否则程序崩溃
indexPath有两个重要的属性,组和行
05-cell的四种样式/内置三个控件
typedef NS_ENUM(NSInteger, UITableViewCellStyle) {
/// 默认样式,只提供文本和图像视图(可选),不显示明细标签
UITableViewCellStyleDefault, // Simple cell with text label and optional image view (behavior of UITableViewCell in iPhoneOS 2.x)
/// 在左侧左对齐标签,在右侧右对齐明细标签(设置中使用)
UITableViewCellStyleValue1, // Left aligned label on left and right aligned label on right with blue text (Used in Settings)
/// 在左侧右对齐标签,在右侧左对齐明细标签(通讯录中使用)
UITableViewCellStyleValue2, // Right aligned label on left with blue text and left aligned label on right (Used in Phone/Contacts)
/// 在顶部左对齐标签,在底部右对齐明细标签
UITableViewCellStyleSubtitle // Left aligned label on top and left aligned label on bottom with gray text (Used in iPod).
};
/// 图像视图,默认为 nil,在需要时创建
@property (nonatomic, readonly, strong, nullable) UIImageView *imageView NS_AVAILABLE_IOS(3_0); // default is nil. image view will be created if necessary.
/// 文本标签,默认为 nil,在需要时创建
@property (nonatomic, readonly, strong, nullable) UILabel *textLabel NS_AVAILABLE_IOS(3_0); // default is nil. label will be created if necessary.
/// 明细文本标签,默认为 nil,在需要时创建,同时 `style` 必须支持 `detail label`
@property (nonatomic, readonly, strong, nullable) UILabel *detailTextLabel NS_AVAILABLE_IOS(3_0); // default is nil. label will be created if necessary (and the current style supports a detail label).
06-cell不重用出现的问题
显示出来的时候才会被创建
当一个cell消失再显示就会重新被创建,为了解决这个问题,苹果推出了cell的复用机制
07-cell的复用机制图例
不显示时从父控件中移除后暂时存到缓存池,需要显示新的cell时先从缓存池找
08-使用cell重用机制/static标识符
默认default样式
不要直接创建cell
先去缓存池找
去缓存池找有两个方法,先使用不带indexPath参数的方法
cell如果没有找到会返回为nil
判断,如果为nil重新创建
因为cellForRow会调用很多次,如果只是string类型相当于会被分配很多次空间,所有加上static
加上static会在静态区,不加会在栈区.
09-iOS6以后的写法
使用带indexPath参数的方法去缓存池找
前提是先注册单元格
如果注册单元格,当系统在缓存池没有找到的时候会自动创建一个注册的类型的cell
不带indexPath
1.去缓存池找
2.如果没有找到,返回nil
3.判断是否找到(是否为nil)
4.如果为空,那么应该重新创建cell
带indexPath
1.去缓存池找.
2.如果没有找到,会自动创建一个,当初注册的类型的cell
// 注册单元格"下面这行代码一定要在数据源方法调用之前实现"
[self.tableView registerClass:[TestCell class] forCellReuseIdentifier:cellid];
// 去缓存池找cell"没有可重用的cell,根据注册类型的cell,自动创建"
UITableViewCell* cell = [tableView dequeueReusableCellWithIdentifier:cellid forIndexPath:indexPath];
10-注册单元格调整样式
重写cell的initWithStyle:方法
NS_DESIGNATED_INITIALIZER 默认棕色 宏定义 含义?
如果你要继承这个控件自定义某个类,重写这个方法
11-cell内部控件懒加载概念
需要用的时候再加载再创建就叫做懒加载,不要想复杂,只是起这么个名字
12-tableView的样式
系统默认而言,拖拽tableView如果是白色就是plain,灰色就是grouped
13-展示汽车品牌-分析需求
需要一个tableView
组的样式
plist根节点是'数组'
字典表示表示每一组的内容
字典下面三个key: title : desc : cars
title: 组上面的内容
desc: 组下面的内容
cars: 当前组中所有的cell的内容 (cell.textLabel)
14-展示汽车品牌-组的头尾标题
- (NSString*)tableView:(UITableView*)tableView titleForFooterInSection:(NSInteger)section // 组下面的title
- (NSString*)tableView:(UITableView*)tableView titleForHeaderInSection:(NSInteger)section // 组上面的title
网友评论