美文网首页
UITableView

UITableView

作者: sunny12 | 来源:发表于2015-11-29 15:34 被阅读96次

      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

          本文链接:https://www.haomeiwen.com/subject/ynalhttx.html