表视图(UItableView)是iOS开发中使用最频繁的视图。一般情况下,我们都会选择以表的形式来展现数据,比如通讯录和频道列表等。在表视图中,分节、分组和索引等功能是我们所展示的数据更规整、更有条理。但是使用的时候,表视图也更难一些。
组成
表头视图:表视图最上面的视图。
表脚视图:表视图最下面的视图。
单元格:表视图每一行的单元视图。
节:由多个单元格组成的一组。每个表视图可以由一个或多个节组成。
-节头:节的头,文字左对齐
-节脚:节的脚,文字左对齐
表视图继承自UIScrollView,且有两个协议:UITableViewDelegate委托协议和UITableViewDataSource数据源协议。表视图还包含很多类,UITableViewCell类是单元格类,UITableViewController类是UITableView的控制器,UITableViewHeaderFooterView类用于为节头节脚提供视图。
分类
普通表视图:主要用户动态表,而动态表一般在单元格数目未知的情况下使用。
分组表视图:一般用于静态表,用来进行界面布局,它会将表分成很多组,这些组由相近的单元格组成。
在需要的时候也可以对表视图进行合理的创新。
单元格
单元格由一个contentView和一个扩展视图组成。我们需要展示数据的地方就是contentView,任何的控件视图都可以往里面添加,例如UIButto,UILabel,UIImageView等等。单元格还有一个默认的隐藏的部分是扩展视图,一般较少用到,而用到的时候使用accessoryType属性来设置,或者使用accessoryView来添加。
accessoryType是一个枚举类型,默认是None,没有扩展图标;还有以下三种枚举成员:
-DisclosureIndicator,触摸该图标切换到下一级表视图,图标为一个向右的箭头;
-DetailDisclosureButton,触摸该单元格时,表视图会以视图的方式展示当前单元格的更多详细信息,图标为一个圈中间加感叹号;
-CheckMark,表示该行被选中,图标为对号。
数据源协议和委托协议
必须要实现的方法:
·返回某个节中的行数
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section;
·为表视图单元格提供数据
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath;
可选实现的方法:
数据源协议主要方法:
·返回节数
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView;
·返回节头的标题
- (nullable NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section;
·返回节脚的标题
- (nullable NSString *)tableView:(UITableView *)tableView titleForFooterInSection:(NSInteger)section;
·提供表视图节索引标题
- (nullable NSArray<NSString *> *)sectionIndexTitlesForTableView:(UITableView *)tableView;
委托协议主要方法:
·单元格高度
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath;
·头视图高度
- (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section;
·脚视图高度
- (CGFloat)tableView:(UITableView *)tableView heightForFooterInSection:(NSInteger)section;
·提供头视图
- (nullable UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section;
·提供脚视图
- (nullable UIView *)tableView:(UITableView *)tableView viewForFooterInSection:(NSInteger)section;
·选中单元格时调用
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath;
相关的方法其实还有很多,比如显示头视图时调用的方法,单元格消失时调用的方法等等。