UITableView的数据源和代理:
数据源方法
必须要实现的数据源方法 (1 ,2 必须实现)
1. - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section:每组数据有多少行
2. - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath:
每一组的每一行显示什么样的cell
其他常用但不是必须要实现的数据源方法:(3, 4 不必须实现)
3.- (NSArray *)sectionIndexTitlesForTableView:(UITableView *)tableView;:
数组中返回右边的索引显示的内容
4.- (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]方法)之后,系统会根据添加的约束计算出各个子空间的位置和尺寸,就可以根据内容得到行高了(减掉不需要显示的内容的尺寸就好)。
使用纯代码:
在初始化的时候把所有的子控件添加上去。
在- (void)layoutSubviews方法中加上布局(注意不要重复添加约束,且要再调用[super layoutSubviews]方法之前添加)
再根据模型内容计算cell的高度。传入模型之后,让cell进行布局(调用[super layoutSubviewsIfNeeded]方法)之后,系统会根据添加的约束计算出各个子空间的位置和尺寸,就可以根据内容得到行高了(减掉不需要显示的内容的尺寸就好)。
通过autoLayout使label根据最大宽度自动换行且自适应高度:
设置label的行数numOfLines为 0 ;
设置label的preferredMaxLayoutWidth(展示内容的最大宽度,即文字的最大宽度),这样label才可以自动根据文字布局(根据最大宽度,自动布局高度),达到自动换行的目的。
注意:如果这个时候添加了label的宽度约束,就会发生约束冲突(不一定会报错误),因为preferredMaxLayoutWidth里面会结合label的字体等,计算出label的宽度
新的写法(注册cell)
NSString *ID = @"wine";
- (void)viewDidLoad {
[super viewDidLoad];
// 注册某个重用标识 对应的 Cell类型
[self.tableView registerClass:[UITableViewCell class] forCellReuseIdentifier:ID];
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
// 1.先去缓存池中查找可循环利用的cell
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:ID];
// 2.设置数据
cell.textLabel.text = [NSString stringWithFormat:@"%zd行的数据", indexPath.row];
return cell;
}
网友评论