UIKit中的常用控件(三):UITableView
本篇博客主要介绍UITableView这个极度重要、使用最广泛的UI控件
一、设置数据源
- 为tableView的dataSource设置数据源,通常将控制器设为数据源
- 数据源需要遵守UITableViewDataSource协议
- 实现以下数据源方法
-
numberOfSectionsInTableView:
返回组的个数(可选,默认为1) -
tableView: numberOfRowsInSection:
返回每个组的行数 -
tableView: cellForRowAtIndexPath:
在这个方法中配置每一行的数据 -
tableView: titleForHeaderInSection:
设置分组的头部标题 -
tableView: titleForFooterInSection:
设置分组的尾部标题
二、UITableView的常见属性
-
rowHeight 行高。默认为44
-
sectionHeaderHeight/sectionFooterHeight 组头部/尾部的高度
-
separatorColor 分割线颜色
-
separatorStyle 分割线的样式
-
SingleLine 默认样式,单行
-
SingleLineEtched 与上面那个一样,但仅支持在grouped样式的tableView中显示
-
None 无分割线
-
tableHeaderView/tableFooterView 整个tableView的头部或尾部控件
</br>
三、UITableViewCell的常见属性
- contentView 子控件,其包含了textLabel、imageView、detailTextLabel三个子控件
- accessoryType 右侧按钮类型
- accessoryView 右侧视图(优先级较高,设置后会覆盖掉右侧按钮)
- selectionStyle 选中样式
- backgroundColor 背景颜色
- backgroundView 背景View
- selectedBackgroundView 选中时的背景View
</br>
四、UITableViewCell的代理
- 为tableView的delegate设置代理,通常将控制器设为代理
- 代理对象需要遵守UITableViewDelegate协议
- 实现以下代理方法
-
tableView: didSelectRowAtIndexPath:
监听用户选中了某一行 -
tableView: didDeselectRowAtIndexPath:
监听用户取消了某一行的选中
</br>
五、UITableView的性能优化
Apple的优化策略:
- 懒加载,只有需要显示的行,才创建对应的cell
- 循环利用。离开tableView的cell暂时放到缓存池中,需要显示的新的cell先尝试从缓存池中
实现方式:
- 在
tableView: cellForRowAtIndexPath:
方法中,对tableView调用dequeueReusableCellWithIdentifier:
方法,尝试在缓存池中取一个唯一标识符与参数一致的tableViewCell - 未取到可用的cell,则调用
initWithStyle: reuseIdentifier:
方法创建一个新的cell。需要在参数中传入一个唯一标识符,便于后续取出cell来重用 - 也可以在
viewDidLoad
方法中调用registerClass:forCellReuseIdentifier:
方法来注册一个重用cell标识。这样当缓存池没有可用的cell时,会自动创建cell
tips:
- 类似于backgroundColor这样的一次性设置(每一行都一样且始终不变),可以放到if语句中,提高性能。
</br>
六、实现索引条
- 实现
sectionIndexTitlesForTableView:
方法,创建一个表示索引条的数组并返回。 - 通过
sectionIndexColor
属性可以设置索引条中的文字颜色 - 用过
sectionIndexBackgroundColor
属性可以设置索引条的背景颜色
</br>
</br>
七、自定义Cell
自动计算行高的方法:
- 设置
rowHeight
属性为UITableViewAutomaticDimension
- 设置一个估算高度
estimatedRowHeight
</br>
八、数据刷新
1.全局刷新
修改数据源中模型的数据,再对tableView调用reloadData
方法即可
2.局部刷新
调用reloadRowsAtIndexPaths:withRowAnimation:
方法,可以指定刷新指定索引位置的数据,并设定刷新时的动画形式
3.添加数据时的局部刷新
添加数据时,调用insertRowsAtIndexPaths:withRowAnimation:
方法,即可在指定位置处播放cell增加的动画
4.删除数据时的局部刷新
删除数据时,调用deleteRowsAtIndexPaths:withRowAnimation:
方法,即可在指定位置处播放cell增加的动画
</br>
九、左滑删除
- 设置代理
- 实现协议中的
tableView: commitEditingStyle: forRowAtIndexPath:
即可实现左滑删除,并在方法中删除掉模型中的数据、调用删除动画方法。 - 修改左滑删除按钮的文字
实现协议中的tableView:titleForDeleteConfirmationButtonForRowAtIndexPath:
方法,返回一个字符串,即可修改删除按钮中的文本
</br>
十、左滑出现多个按钮
实现协议中的tableView:editActionsForRowAtIndexPath:
方法,返回一个包含了所有按钮的数组即可
- 通过
UITableViewRowAction
的类方法rowActionWithStyle:title:handler:
方法创建即可创建一个按钮,并在handler这个block类型的参数中设置点击时触发的操作即可
</br>
十一、编辑模式
- 修改tableView的editing属性为YES即可直接进入编辑模式
- 调用
setEditing:animated:
方法也可进入编辑模式,参数传入YES则有动画
十二、编辑模式下多选
设置tableView的allowsMutipleSelectionDuringEditing
属性为YES,即可在进入编辑模式时允许多选。
调用tableView的indexPathsForSelectedRows
方法可以获取到用户在编辑模式下所选中的所有Cell的索引