iOS UITableView的多选

作者: funnyS | 来源:发表于2017-01-23 11:13 被阅读9006次

    好久没写博客了,写些平常用的到的东西吧。一些列表经常需要编辑多选的功能,而UITableview自带多选删除的功能,使用起来方便,不需要自己去做数据存储和选中状态转换,可以减少不少开发时间。下面就来介绍下UITableView多选的使用。
    效果 :

    123.gif
    UITableViewCellEditingStyle

    编辑状态UITableViewCellEditingStyle有三种模式:

    • UITableViewCellEditingStyleDelete
    • UITableViewCellEditingStyleInsert
    • UITableViewCellEditingStyleNone

    多选框的风格, 只需要风格同时包含UITableViewCellEditingStyleDelete和UITableViewCellEditingStyleInsert就可以了

    - (UITableViewCellEditingStyle)tableView:(UITableView *)tableView editingStyleForRowAtIndexPath:(NSIndexPath *)indexPath{
        return UITableViewCellEditingStyleDelete | UITableViewCellEditingStyleInsert;
    }
    

    然后设置UITableview的Editing状态,就可开启tableview的多选功能。

    使用自带的编辑状态去做多选功能的好处

    • 不用去记录数据源中选中的数组,通过indexPathsForSelectedRows方法就可以获取到选中的cell,做删除操作时也会方便很多.
    • 进入退出编辑状态方便,还有自带的动画。ps:自定义cell时,子视图应加载在cell的contentView上。
    • 在要求不高的情况下,自带的图标就能满足需求。
    11111.png
    接下来先说说全选和全不选的操作,以下都是在单section情况下
    • 做全选也简单,遍历一遍数据源 然后选中每一条。
    [self.listData enumerateObjectsUsingBlock:^(id  _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
                [self.tableView selectRowAtIndexPath:[NSIndexPath indexPathForRow:idx inSection:0] animated:NO scrollPosition:UITableViewScrollPositionNone];
            }];
    
    • 全不选,reload就可以变为全不选状态了,如果不想reload这样简单粗暴的,也可以取出当前选中的indexpath数组,遍历反选也可以。
            [self.tableView reloadData];
            /** 遍历反选
            [[self.tableView indexPathsForSelectedRows] enumerateObjectsUsingBlock:^(NSIndexPath * _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
                [self.tableView deselectRowAtIndexPath:obj animated:NO];
            }];
             */
    
    • 多section情况类似,在删除操作的时候注意点,删除到section的cell到最后一个时 需要删除整个section。
    编辑操作,下面以删除为例
    NSMutableIndexSet *insets = [[NSMutableIndexSet alloc] init];
            [[self.tableView indexPathsForSelectedRows] enumerateObjectsUsingBlock:^(NSIndexPath * _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
                [insets addIndex:obj.row];
            }];
            [self.listData removeObjectsAtIndexes:insets];
            [self.tableView deleteRowsAtIndexPaths:[self.tableView indexPathsForSelectedRows] withRowAnimation:UITableViewRowAnimationFade];
            
            /** 数据清空情况下取消编辑状态*/
            if (self.listData.count == 0) {
                self.navigationItem.rightBarButtonItem.title = @"编辑";
                [self.tableView setEditing:NO animated:YES];
                [self showEitingView:NO];
                /** 带MJ刷新控件重置状态
                [self.tableView.footer resetNoMoreData];
                [self.tableView reloadData];
                 */
            }
    
    Cell点击效果的问题,有的人会觉得那个蓝色的背景很难看,想去掉,可以在自定义的cell里面:
    self.multipleSelectionBackgroundView = [UIView new];
    

    还可以修改有点击选中图标的颜色,其他默认图片的颜色也会因此而修改,

    self.tintColor = [UIColor redColor];
    

    效果:


    12222.png

    如果不想使用默认图标的话,也可以在自定义:

    -(void)layoutSubviews
    {
        for (UIControl *control in self.subviews){
            if ([control isMemberOfClass:NSClassFromString(@"UITableViewCellEditControl")]){
                for (UIView *v in control.subviews)
                {
                    if ([v isKindOfClass: [UIImageView class]]) {
                        UIImageView *img=(UIImageView *)v;
                        if (self.selected) {
                            img.image=[UIImage imageNamed:@"xuanzhong_icon"];
                        }else
                        {
                            img.image=[UIImage imageNamed:@"weixuanzhong_icon"];
                        }
                    }
                }
            }
        }
        [super layoutSubviews];
    }
    
    
    //适配第一次图片为空的情况
    - (void)setEditing:(BOOL)editing animated:(BOOL)animated
    {
        [super setEditing:editing animated:animated];
        for (UIControl *control in self.subviews){
            if ([control isMemberOfClass:NSClassFromString(@"UITableViewCellEditControl")]){
                for (UIView *v in control.subviews)
                {
                    if ([v isKindOfClass: [UIImageView class]]) {
                        UIImageView *img=(UIImageView *)v;
                        if (!self.selected) {
                            img.image=[UIImage imageNamed:@"weixuanzhong_icon"];
                        }
                    }
                }
            }
        }
        
    }
    

    效果:


    13333.png

    demo地址:https://github.com/yxsufaniOS/TableViewMutableSelectDemo

    相关文章

      网友评论

      • e99c92ed069a:有没有什么方法可以让我点击一个区内的任意一个cell都会选中整个区啊
        e99c92ed069a:我找到了方法了,像全选那样,数据源改为这个区的就行了
      • RiberWang:大神 如果想要限制多选的个数呢
      • HanOBa:好人一生平安。
      • LV大树:got it。
      • 浩成哥哥:求多分区的demo:+1:
      • 洁简:这个选择的大小能改变吗
      • 混不吝丶:用系统的编辑状态 代码量也太多了:flushed:
        funnyS:@混不吝丶 这还多啊,除了图片自定义,加起来才几句话,自己写更多啊:sweat:
      • 612b500d03e5:swift不支持多选
        0a6830556bcc:支持的
        func tableView(_ tableView: UITableView, editingStyleForRowAt indexPath: IndexPath) -> UITableViewCellEditingStyle {
        let type = UITableViewCellEditingStyle.delete.rawValue | UITableViewCellEditingStyle.insert.rawValue

        return UITableViewCellEditingStyle(rawValue: type)!
        }
      • 037ec15c586d:正需要

      本文标题:iOS UITableView的多选

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