ios--小结系列六
一、掌握
(1) 设置UITableView的dataSource、delegate
(2) UITableView多组数据和单组数据的展示
(3) UITableViewCell的常见属性
(4) UITableView的性能优化(cell的循环利用)
(5) 自定义Cell
二、基本概念
(1) 什么是UITableView
a) 在众多移动应用中,能看到各式各样的表格数据
b) 在iOS中,要实现表格数据展示,最常用的做法就是使用UITableView
c) UITableView继承自UIScrollView,因此支持垂直滚动,而且性能极佳
(2) UITableView的两种样式
三、数据源
(1) 如何展示数据
a) UITableView需要一个数据源(dataSource)来显示数据
b) UITableView会向数据源查询一共有多少行数据以及每一行显示什么数据等
c) 没有设置数据源的UITableView只是个空壳
d) 凡是遵守UITableViewDataSource协议的OC对象,都可以是UITableView的数据源
(2) tableView和数据源
(3) tableView展示数据的过程
a) 调用数据源的下面方法得知一共有多少组数据
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView;
b) 调用数据源的下面方法得知每一组有多少行数据
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section;
c) 调用数据源的下面方法得知每一行显示什么内容
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath;
(4) 字典转模型
四、MVC
(1) 初始MVC
a) MVC是一种设计思想,贯穿于整个iOS开发中,需要积累一定的项目经验,才能深刻体会其中的含义和好处
b) MVC中的三个角色
c) MVC的几个明显的特征和体现:
五、Cell
(1) Cell简介
a) UITableView的每一行都是一个UITableViewCell,通过dataSource的tableView:cellForRowAtIndexPath:方法来初始化每一行
b) UITableViewCell内部有个默认的子视图:contentView,contentView是UITableViewCell所显示内容的父视图,可显示一些辅助指示视图
c) 辅助指示视图的作用是显示一个表示动作的图标,可以通过设置UITableViewCell的accessoryType来显示,默认是UITableViewCellAccessoryNone(不显示辅助指示视图),其他值如下:
d) 还可以通过cell的accessoryView属性来自定义辅助指示视图(比如往右边放一个开关)
(2) UITableViewCell的contentView
a) contentView下默认有3个子视图
b) UITableViewCell还有一个UITableViewCellStyle属性,用于决定使用contentView的哪些子视图,以及这些子视图在contentView中的位置
(3) UITableViewCell结构
六、性能优化
(1) Cell的重用原理
a) iOS设备的内存有限,如果用UITableView显示成千上万条数据,就需要成千上万个UITableViewCell对象的话,那将会耗尽iOS设备的内存。要解决该问题,需要重用UITableViewCell对象
b) 重用原理:当滚动列表时,部分UITableViewCell会移出窗口,UITableView会将窗口外的UITableViewCell放入一个对象池中,等待重用。当UITableView要求dataSource返回UITableViewCell时,dataSource会先查看这个对象池,如果池中有未使用的UITableViewCell,dataSource会用新的数据配置这个UITableViewCell,然后返回给UITableView,重新显示到窗口中,从而避免创建新对象
c) 还有一个非常重要的问题:有时候需要自定义UITableViewCell(用一个子类继承UITableViewCell),而且每一行用的不一定是同一种UITableViewCell,所以一个UITableView可能拥有不同类型的UITableViewCell,对象池中也会有很多不同类型的UITableViewCell,那么UITableView在重用UITableViewCell时可能会得到错误类型的UITableViewCell
d) 解决方案:UITableViewCell有个NSString *reuseIdentifier属性,可以在初始化UITableViewCell的时候传入一个特定的字符串标识来设置reuseIdentifier(一般用UITableViewCell的类名)。当UITableView要求dataSource返回UITableViewCell时,先通过一个字符串标识到对象池中查找对应类型的UITableViewCell对象,如果有,就重用,如果没有,就传入这个字符串标识来初始化一个UITableViewCell对象
(2) Cell的重用代码
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
// 1.定义一个cell的标识
static NSString *ID = @"mjcell";
// 2.从缓存池中取出cell
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:ID];
// 3.如果缓存池中没有cell
if (cell == nil) {
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:ID];
}
// 4.设置cell的属性...
return cell;
}