UITableView

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对象

注意点:

  1. 使用tableview的时候一定要注意性能,相同类型的cell要重用。
  2. 使用自动布局设置cell子控件的布局的时候:
    • 使用xib或者storyBoard:
      1. 首先在interfaceBuilder中添加好约束;
      2. 再根据模型内容计算cell的高度。传入模型之后,让cell进行布局(调用[self layoutIfNeeded]方法)之后,系统会根据添加的约束计算出各个子空间的位置和尺寸,就可以根据内容得到行高了(减掉不需要显示的内容的尺寸就好)。
  • 使用纯代码:
    1. 在初始化的时候把所有的子控件添加上去。
    2. - (void)layoutSubviews方法中加上布局(注意不要重复添加约束,且要再调用[super layoutSubviews]方法之前添加)
    3. 再根据模型内容计算cell的高度。传入模型之后,让cell进行布局(调用[super layoutSubviewsIfNeeded]方法)之后,系统会根据添加的约束计算出各个子空间的位置和尺寸,就可以根据内容得到行高了(减掉不需要显示的内容的尺寸就好)。
  1. 通过autoLayout使label根据最大宽度自动换行且自适应高度

    • 设置label的行数numOfLines0
    • 设置label的preferredMaxLayoutWidth(展示内容的最大宽度,即文字的最大宽度),这样label才可以自动根据文字布局(根据最大宽度,自动布局高度),达到自动换行的目的。

    注意:如果这个时候添加了label的宽度约束,就会发生约束冲突(不一定会报错误),因为preferredMaxLayoutWidth里面会结合label的字体等,计算出label的宽度

你可能感兴趣的:(UITableView)