美文网首页IOS 视图跳转/层级相关的知识
iOS TableView的单元格实现单选功能

iOS TableView的单元格实现单选功能

作者: Spring_Lau | 来源:发表于2016-07-02 13:30 被阅读6214次

    我最近在做的一个项目中遇到了单元格单选的功能,当时我的第一想法是在单元格上添加按钮,通过点击改变按钮的背景图片并记录最后一次点击的indexPath,因为之前的项目中遇到过多选的功能,用这种方法出现了复用的问题,也就是选择某个单元格滑动表格时没点击的单元格也被选中了,所以当时就很担心单选的时候出现同样的问题,果不其然,只显示最后一个单元格被选中。然后我找到了这种方法,总结了一下

    这个功能的实现只需要在两个方法中code即可

    首选我们公开一个属性

    @property(nonatomic,strong)NSIndexPath *lastPath;

    主要是用来接收用户上一次所选的cell的indexpath

    第一步:在cellForRowAtIndexPath:方法中实现如下代码

    -(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{

    NSInteger row = [indexPath row];

    NSInteger oldRow = [lastPath row];

    if (row == oldRow && lastPath!=nil) {

    //这个是系统中对勾的那种选择框

    cell.accessoryType = UITableViewCellAccessoryCheckmark;

    }else{

    cell.accessoryType = UITableViewCellAccessoryNone;

    }

    }

    第二步:在didSelectRowAtIndexPath:中实现如下代码

    -(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{

    //这里最好不要声明int类型的,个人建议

    NSInteger newRow = [indexPath row];

    NSInteger oldRow = (self .lastPath !=nil)?[self .lastPath row]:-1;

    if (newRow != oldRow) {

    UITableViewCell *newCell = [tableView cellForRowAtIndexPath:indexPath];

    newCell.accessoryType = UITableViewCellAccessoryCheckmark;

    UITableViewCell *oldCell = [tableView cellForRowAtIndexPath:lastPath];

    oldCell.accessoryType = UITableViewCellAccessoryNone;

    self .lastPath = indexPath;

    }

    [tableView deselectRowAtIndexPath:indexPath animated:YES];

    }

    Ok,可以收工了,这样实现之后的效果是每次单击一个cell会做一个选中的标志并且托动表视图时也不会出现checkmark的复用

    不过,根据项目需求,可能会需要定义一个按钮,自定义选择框的图片,这也很简单,只需要将上面的代码改一下就ok了:

    在cellForRowAtIndexPath:中如下修改

    if (row == oldRow && self.lastPath!=nil) {

    [cell . selectBtn setBackgroundImage:[UIImage imageNamed:@"选中点"] forState:UIControlStateNormal];

    }else{

    [cell . selectBtn setBackgroundImage:[UIImage imageNamed:@""] forState:UIControlStateNormal];

    }

    在didSelectRowAtIndexPath:中如下修改

    if (newRow != oldRow) {

    self.cell = [tableView cellForRowAtIndexPath:indexPath];

    [self .cell.selectBtn setBackgroundImage:[UIImage imageNamed:@"选中点"] forState:UIControlStateNormal];

    self.cell = [tableView cellForRowAtIndexPath:self .lastPath];

    [self .cell.selectBtn setBackgroundImage:[UIImage imageNamed:@""] forState:UIControlStateNormal];

    self .lastPath = indexPath;

    }

    相关文章

      网友评论

      • 6bbba3902a7a:如果有默认值呢,然后在点击cell的时候,怎么去掉默认的值呢
      • 6bbba3902a7a:如果需要一个默认值呢,点击cell的时候,怎么把默认的取消呢
      • 小桥流水青山碧海:第二次选择 直接报错了
        NSInteger oldRow = (_lastPath !=nil)?[_lastPath row]:-1;Thread 1: EXC_BAD_ACCESS (code=1, address=0xe16de7ac)
      • 俊俊吖:你可以给cell的赋值Model赋值根据这个值来判断选中状态:blush:
      • 俊俊吖:其实这么做是不对的,你没有考虑到cell的重用问题,当你向上拉时或者向下拉时cell重用对勾会消失
        大魔导师刘秀:@我叫山鸡_ 自定义cell,在prepareForReuse()方法中将选中状态都取消
        我叫山鸡_:那应该怎么解决啊
      • 这个姑凉儿:写的不错
      • itonny:self .cell.selectBtn 这个按钮哪里来的?
      • luroad:请问有相关demo吗,给个链接
        3870d183d931:有一个是系统的选中状态,下面是告诉你的方法,是自定义的一个选中状态,也就是勾选的图标
        系统的是会出现向左滑动的效果。
        luroad:@小萌同学 写的出现了一些问题,进入页面不点击第一个会出现两个选中
        3870d183d931:这么详细还需要demo?

      本文标题:iOS TableView的单元格实现单选功能

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