01-预习复习
02-tableView简介
概念
非常非常常用,没有tableView基本就不能叫应用
支持垂直滚动
以行为单位显示,每行显示一个 cell (单元格) <font color=red>(有且仅有一个,是一个多行单列的视图)</font>
每一个 cell 都是一个 UITableViewCell 对象
自定义 UITableViewCell 能够表现非常丰富的界面展现 <font color=red>(主要是可定制自定义的UITableViewCell 里面的 contentView 可以很自由的布局和添加任意子控件)</font>
UITableView 的性能优化是目前面试中被问及频率颇高的问题 <font color=red>(cell复用,只重新赋值,不重新创建)</font>
UITableView 内置了复用机制,实现性能优化
有两种样式(留个印象) <font color=red>(plain 和 grouped 样式)</font>
小结
一行(row) 一个 Cell,垂直滚动
Cell 可以定制
要满足快速滚动,表格的性能很重要
有一个 复用机制
两种样式
03-tableView显示数据的模式
dataSource 提供数据的对象,显示的内容 <font color=red>(UITableViewDataSource)</font>
delegate 监听事件(选中,滚动到某一行) <font color=red>(UITableViewDelegate)</font>
-
系统提供了tableView的垂直滚动,可以以行的形式显示,可以选中等等.但本身并不知道显示的内容,需要另外一个对象(vc)通过数据源提供
- tableView:
- 总共有多少组 <font color=red>(- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView)</font>
- 每一组有多少行 <font color=red>(- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section)</font>
- 每个组/行显示的内容 <font color=red>(- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath)</font>
- vc: <font color=red>vc一般作为数据源协议代理对象</font>
- 告诉tableView有多少组
- 告诉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的复用机制
- <font color=red>不管你用不用复用机制,默认的cell在出屏幕时,会被UITableViewWrapper删除,并放到NSSet的cell缓存池里.这是UITableViewCell的默认行为.</font>
- <font color=red>当使用复用机制时,会首先在cell缓存池里找复用的cell,找的到,拿出来重新赋值,找不到才alloc init. 这样可以节省alloc init的cpu开销.</font>
07-cell的复用机制图例
- 不显示时从父控件中移除后暂时存到缓存池,需要显示新的cell时先从缓存池找
08-使用cell重用机制/static标识符
默认default样式 <font color=red>左边一个UIImageView 右边一个 titleLabelText</font>
不要直接创建cell <font color=red>注册UITableViewCell的类型有3中方式:1.registerClass 2.xib 3.sb 拖拽一个 UITableViewCell 并设置 identifier</font>
先去缓存池找
去缓存池找有两个方法,先使用不带indexPath参数的方法
cell如果没有找到会返回为nil
判断,如果为nil重新创建
因为cellForRow会调用很多次,如果只是string类型相当于会被分配很多次空间,所有加上static
加上static会在静态区,不加会在栈区.
09-iOS6以后的写法
- 使用带indexPath参数的方法去缓存池找
- 前提是先注册单元格 <font color=red>3中方式.看上面</font>
- 如果注册单元格,当系统在缓存池没有找到的时候会自动创建一个注册的类型的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 <font color=red>修改背景色为灰色,组之间加间隔</font>
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