UITableView

  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;

}

你可能感兴趣的:(UITableView)