UITableView的数据源和代理:
数据源方法
-
必须要实现的数据源方法
-
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
:每组数据有多少行 -
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
:每一组的每一行显示什么样的cell
-
-
其他常用但不是必须要实现的数据源方法:
-
- (NSArray *)sectionIndexTitlesForTableView:(UITableView *)tableView;
:数组中返回右边的索引显示的内容 -
- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath;
:提交编辑。只要实现了这个方法,就可以实现左滑出现按钮。至于出现那些按钮,在这个代理方法中传入--- (NSArray *)tableView:(UITableView *)tableView editActionsForRowAtIndexPath:(NSIndexPath *)indexPath );
数组中装的是UITableViewRowAction
对象
-
代理方法
没有必须要实现的方法,代理主要是监听事件和做一些附加的约束
-
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath;
:返回对应cell的高度,适用于不等高的cell时,动态的设置每个cell的高度;(注意:如果是等高的cell,可以设置tableView.rowHeight属性,是每行等高;不设置,默认cell的高度44) -
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath;
:当选中了某一行的时候调用 -
- (UITableViewCellEditingStyle)tableView:(UITableView *)tableView editingStyleForRowAtIndexPath:(NSIndexPath *)indexPath;
:返回进入编辑模式之后,每一行的编辑模式类型(左边的按钮) -
- (NSArray *)tableView:(UITableView *)tableView editActionsForRowAtIndexPath:(NSIndexPath *)indexPath ;
:返回左滑是出现的按钮,数组中装的是UITableViewRowAction
对象
注意点:
- 使用tableview的时候一定要注意性能,相同类型的cell要重用。
- 使用自动布局设置cell子控件的布局的时候:
- 使用xib或者storyBoard:
- 首先在interfaceBuilder中添加好约束;
- 再根据模型内容计算cell的高度。传入模型之后,让cell进行布局(调用
[self layoutIfNeeded]
方法)之后,系统会根据添加的约束计算出各个子空间的位置和尺寸,就可以根据内容得到行高了(减掉不需要显示的内容的尺寸就好)。
- 使用xib或者storyBoard:
- 使用纯代码:
- 在初始化的时候把所有的子控件添加上去。
- 在
- (void)layoutSubviews
方法中加上布局(注意不要重复添加约束,且要再调用[super layoutSubviews]
方法之前添加) - 再根据模型内容计算cell的高度。传入模型之后,让cell进行布局(调用
[super layoutSubviewsIfNeeded]
方法)之后,系统会根据添加的约束计算出各个子空间的位置和尺寸,就可以根据内容得到行高了(减掉不需要显示的内容的尺寸就好)。
-
通过autoLayout使label根据最大宽度自动换行且自适应高度:
- 设置label的行数
numOfLines
为 0 ; - 设置label的
preferredMaxLayoutWidth
(展示内容的最大宽度,即文字的最大宽度),这样label才可以自动根据文字布局(根据最大宽度,自动布局高度),达到自动换行的目的。
注意:如果这个时候添加了label的宽度约束,就会发生约束冲突(不一定会报错误),因为
preferredMaxLayoutWidth
里面会结合label的字体等,计算出label的宽度 - 设置label的行数