美文网首页iOSiOS Developer
iOS tableView实现单选和多选

iOS tableView实现单选和多选

作者: 4ed6afef78f9 | 来源:发表于2017-07-11 00:33 被阅读623次

    今天在项目中遇到了tableView的单选需求,现在总结一下,用一个简单的demo实现了简单的单选和多选两个功能.先看下效果图:

    QQ20170711-000641.gif

    1:首先实现下单选

    1:使用一个变量记录选中的行

    @property (assign, nonatomic) NSIndexPath       *selIndex;      //单选选中的行
    
    

    2:设置tableView数据,共2组,每组10行,

    - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
        return 2;
    }
    - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
        return 10;
    }
    

    3:实现tableView的点击方法,每次点击记录点击的索引,取消之前的选择行,将当前选择的行打钩

    -(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{
        
            //取消之前的选择
            UITableViewCell *celled = [tableView cellForRowAtIndexPath:_selIndex];
            celled.accessoryType = UITableViewCellAccessoryNone;
            
            //记录当前的选择的位置
            _selIndex = indexPath;
            
            //当前选择的打钩
            UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath];
            cell.accessoryType = UITableViewCellAccessoryCheckmark;
    }
    

    4:列表滚动时,判断是否为选中的行,如果是cell是选中的那一行,就设置cell的accessoryType为UITableViewCellAccessoryCheckmark,到这里单选就实现完成了

    
    - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
        
        static NSString *cellid = @"cellid";
        UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellid];
        if (cell == nil) {
            cell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellid];
        }
        cell.textLabel.text = [NSString stringWithFormat:@"第%zi组,第%zi行",indexPath.section+1,indexPath.row];
    
       if (_selIndex == indexPath) {
             cell.accessoryType = UITableViewCellAccessoryCheckmark;
       }else{
             cell.accessoryType = UITableViewCellAccessoryNone;
       }
       return cell;
    }
    
    

    2:下面实现多选

    1:使用一个数组记录选中的行

    @property (strong, nonatomic) NSMutableArray    *selectIndexs;  //多选选中的行
    
    

    2:使用一个变量判断是单选还是多选状态

    @property (nonatomic, assign) BOOL              isSingle;       //单选还是多选
    
    

    3:导航栏右侧按钮设置为单选和双选的切换按钮,并初始化多选记录数组

    UIBarButtonItem *rightItem = [[UIBarButtonItem alloc]initWithTitle:@"多选" style:UIBarButtonItemStylePlain target:self action:@selector(singleSelect)];
        self.navigationItem.rightBarButtonItem = rightItem;
        
        //初始化多选数组
        _selectIndexs = [NSMutableArray new];
    

    4:点击导航栏上的切换按钮切换单选还是多选状态

    //单选还是多选按钮点击事件
    -(void)singleSelect{
        _isSingle = !_isSingle;
        if (_isSingle) {
            self.navigationItem.rightBarButtonItem.title = @"多选";
            self.title = @"(单选)";
            //切换为单选的时候,清除多选数组,重新加载列表
            [self.selectIndexs removeAllObjects];
            [self.tableView reloadData];
        }else{
            self.title = @"(多选)";
            self.navigationItem.rightBarButtonItem.title = @"单选";
        }
    }
    

    5:为tableView的点击方法中加上单选还是多选的状态判断,多选的话,将点击的行加入到多选索引数组中去,然后改变该行的cell.accessoryType,重复点击就做反操作

    //选中某一行
    -(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{
        
        if (_isSingle) {       //单选
            //取消之前的选择
            UITableViewCell *celled = [tableView cellForRowAtIndexPath:_selIndex];
            celled.accessoryType = UITableViewCellAccessoryNone;
            
            //记录当前的选择的位置
            _selIndex = indexPath;
            
            //当前选择的打钩
            UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath];
            cell.accessoryType = UITableViewCellAccessoryCheckmark;
            
        }else{                      //多选
            UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath];
            
            if (cell.accessoryType == UITableViewCellAccessoryCheckmark) { //如果为选中状态
                cell.accessoryType = UITableViewCellAccessoryNone; //切换为未选中
                [_selectIndexs removeObject:indexPath]; //数据移除
            }else { //未选中
                cell.accessoryType = UITableViewCellAccessoryCheckmark; //切换为选中
                [_selectIndexs addObject:indexPath]; //添加索引数据到数组
            }
        }
    }
    

    6:在cellForRow代理方法中同样加入单选多选的判断,在滚动列表是加载列表,判断是否选中

    - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
        
        static NSString *cellid = @"cellid";
        UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellid];
        if (cell == nil) {
            cell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellid];
        }
        cell.textLabel.text = [NSString stringWithFormat:@"第%zi组,第%zi行",indexPath.section+1,indexPath.row];
        
        if (_isSingle) {            //单选
            if (_selIndex == indexPath) {
                cell.accessoryType = UITableViewCellAccessoryCheckmark;
            }else{
                cell.accessoryType = UITableViewCellAccessoryNone;
            }
            return cell;
        }else{                      //多选
            cell.accessoryType = UIAccessibilityTraitNone;
            for (NSIndexPath *index in _selectIndexs) {
                if (indexPath == index) {
                    cell.accessoryType = UITableViewCellAccessoryCheckmark;
                }
            }
        }
        return cell;
    }
    

    到这里就完成了,没什么技术含量,有需求的可以参考下,有好的想法可以多多交流,项目在github的地址.

    相关文章

      网友评论

      本文标题:iOS tableView实现单选和多选

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