UITableView是UIKit中最重要的一个组件之一,可以用来展示数据列表,也可以用来做页面布局和开发专用组件。UITableView的使用遵循MVC模式,从而实现数据模型、视图、控制器分离。UITableView继承自UIScrollView,可上下滑动,可以作为根视图,也可以作为子视图。与UITableView相关的概念有很多:UITableViewController、UITableViewDelegate、UITableViewDataSource、UITableViewCell等等,下面是一些简单的介绍。
UITableViewController继承自UIViewController并遵循UITableViewDelegate和UITableViewDataSource两个协议。
UITableViewDelegate遵循UIScrollViewDelegate和NSObject,提供一系列方法来自定义tableView的样式。
UITableViewDataSource遵循NSObject,提供一系列方法来填充tableView的数据。
UITableViewCell的复用原理
在UITableViewController中创建UITableViewCell时常用到如下方法:
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:<#@"reuseIdentifier"#> forIndexPath:indexPath];
其中的@“reuseIdentifier”就是一个复用标识符,是一个独一无二的字符串,用来唯一标示某种重复样式的UITableViewCell,提高加载效率。系统在创建足够多的Cell后(覆盖整个tableView),保存并重复这些Cell,避免重复创建和销毁Cell。UITableView中有两个数组用来实现这一机制:visiableCells和reuseableTableCells。前者用来保存当前屏幕可见的Cell,后者用来保存那些可以复用的Cell。
一个tableView是否可以关联两个datasource
可以。可以直接将多个数据源合并为一个数据源,也可以分别关联。
如何对UITableView的滚动加载进行优化
对UITableView的滚动优化主要在以下两个方面
减少cellForRowAtIndexPath中的计算量(cell的内容计算):
1、提前计算每个cell中用到的基本数据,调用时直接取出
2、异步加载图片,之后再填入cell内部的UIImageView
3、图片数量多时,图片的尺寸需要经过transform矩阵变化压缩好,或者只加载预览图。
4、图片懒加载,避免滚动速度过快时频繁请求数据
5、尽量手动Drawing视图而不是直接使用UITableViewCell的子类。
减少heightForRowAtIndexPath的计算量(cell的高度计算):
1、如果cell高度固定,可以去掉HeightForRowAtIndex代理,直接设置tableView的rowHeight属性作为固定高度
2、如果高度不固定,可以将cell的高度提前计算好存储起来,代理调用时直接取。