美文网首页
iOS TableView的单选和多选

iOS TableView的单选和多选

作者: 不简单的风度 | 来源:发表于2017-06-07 16:00 被阅读398次

    前言

    在平时的开发tableview可以说是用到的最多的控件了,而且tableview的单选和多选也并不少见,今天就来讨论下tableview的单选和多选。

    单选

    单选的逻辑其实就是记录选中的indexpath,然后当用户选择cell的时候把上次选中的cell取消,选中本次选择的cell

    #import "SingleSelectViewController.h"
    
    @interface SingleSelectViewController ()<UITableViewDelegate,UITableViewDataSource>
    
    @property (nonatomic, strong) UITableView     *tableView;
    @property (nonatomic, strong) NSMutableArray  *dataArray;
    @property (nonatomic, strong) NSIndexPath     *selectedIndexPath;
    
    @end
    
    @implementation SingleSelectViewController
    
    - (void)viewDidLoad {
        [super viewDidLoad];
        // Do any additional setup after loading the view.
        
        self.view.backgroundColor = [UIColor whiteColor];
        self.title = @"single select";
        
        [self setupViews];
    }
    
    - (void)setupViews{
        
        for (NSInteger i = 0; i < 10; i ++) {
            NSString *str = [NSString stringWithFormat:@">>>>>%lu",i];
            [self.dataArray addObject:str];
        }
        
        
        self.tableView = [[UITableView alloc] initWithFrame:self.view.bounds style:UITableViewStylePlain];
        self.tableView.dataSource = self;
        self.tableView.delegate   = self;
        self.tableView.tableFooterView = [UIView new];
        self.tableView.cellLayoutMarginsFollowReadableWidth = NO;
        [self.view addSubview:self.tableView];
        
    }
    
    - (BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath{
        return YES;
    }
    
    - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{
        return self.dataArray.count;
    }
    - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
        static NSString *identifier = @"cell";
        UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:identifier];
        if (cell == nil) {
            cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:identifier];
            cell.selectionStyle = UITableViewCellSelectionStyleNone;
        }
        
        if (self.selectedIndexPath && self.selectedIndexPath == indexPath) {
            cell.textLabel.textColor = [UIColor blueColor];
            cell.accessoryType = UITableViewCellAccessoryCheckmark;
        }else{
            cell.textLabel.textColor = [UIColor blackColor];
            cell.accessoryType = UITableViewCellAccessoryNone;
        }
        
        cell.textLabel.text = self.dataArray[indexPath.row];
        
        return cell;
    }
    
    - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{
        
        UITableViewCell *cell;
        
        /*NSIndexPath *indexPath = [NSIndexPath indexPathForRow:sender.tag inSection:0];*/ /*如果是点击cell上子控件可用此方法找到对应path*/
        
        if (self.selectedIndexPath) {
            cell = [self.tableView cellForRowAtIndexPath:self.selectedIndexPath];
            cell.textLabel.textColor = [UIColor blackColor];
            cell.accessoryType = UITableViewCellAccessoryNone;
        }
        
        cell = [self.tableView cellForRowAtIndexPath:indexPath];
        cell.textLabel.textColor = [UIColor blueColor];
        cell.accessoryType = UITableViewCellAccessoryCheckmark;
        
        self.selectedIndexPath = indexPath;
        [self.tableView reloadData];
    }
    
    - (NSMutableArray *)dataArray{
        if (!_dataArray) {
            _dataArray = [NSMutableArray array];
        }
        return _dataArray;
    }
    
    
    - (void)didReceiveMemoryWarning {
        [super didReceiveMemoryWarning];
        // Dispose of any resources that can be recreated.
    }
    
    /*
    #pragma mark - Navigation
    
    // In a storyboard-based application, you will often want to do a little preparation before navigation
    - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
        // Get the new view controller using [segue destinationViewController].
        // Pass the selected object to the new view controller.
    }
    */
    
    @end
    

    多选

    多选的逻辑也不复杂,主要是再编辑状态下记录用户选择了哪些cell,在editingStyleForRowAtIndexPath里返回UITableViewCellEditingStyleDelete | UITableViewCellEditingStyleInsert就可以设置多选,多选的时候只要操作相应的数据就可以了

    #import "MoreSelectViewController.h"
    
    @interface MoreSelectViewController ()<UITableViewDelegate,UITableViewDataSource>
    
    @property (nonatomic, strong) UITableView    *tableView;
    @property (nonatomic, strong) NSMutableArray *dataArray;
    @property (nonatomic, strong) NSMutableArray *selectArray;
    
    @end
    
    @implementation MoreSelectViewController
    
    - (void)viewDidLoad {
        [super viewDidLoad];
        // Do any additional setup after loading the view.
        self.view.backgroundColor = [UIColor whiteColor];
        
        self.title = @"more select";
        
        [self setupViews];
        
    }
    
    - (void)setupViews{
        
        for (NSInteger i = 0; i < 10; i ++) {
            NSString *str = [NSString stringWithFormat:@">>>>>%lu",i];
            [self.dataArray addObject:str];
        }
        
        UIBarButtonItem *item = [[UIBarButtonItem alloc] initWithTitle:@"编辑" style:UIBarButtonItemStyleDone target:self action:@selector(editAction:)];
        self.navigationItem.rightBarButtonItem = item;
        
        
        self.tableView = [[UITableView alloc] initWithFrame:self.view.bounds style:UITableViewStylePlain];
        self.tableView.dataSource = self;
        self.tableView.delegate   = self;
        self.tableView.tableFooterView = [UIView new];
        self.tableView.cellLayoutMarginsFollowReadableWidth = NO;
        [self.view addSubview:self.tableView];
        
    }
    
    - (BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath{
        return YES;
    }
    
    - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{
        return self.dataArray.count;
    }
    - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
        static NSString *identifier = @"cell";
        UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:identifier];
        if (cell == nil) {
            cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:identifier];
        }
        
        cell.textLabel.text = self.dataArray[indexPath.row];
        
        return cell;
    }
    
    - (UITableViewCellEditingStyle)tableView:(UITableView *)tableView editingStyleForRowAtIndexPath:(NSIndexPath *)indexPath{
        return UITableViewCellEditingStyleDelete | UITableViewCellEditingStyleInsert;
    }
    
    - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{
        
        NSString *str = self.dataArray[indexPath.row];
        [self.selectArray addObject:str];
    }
    - (void)tableView:(UITableView *)tableView didDeselectRowAtIndexPath:(NSIndexPath *)indexPath{
        NSString *str = self.dataArray[indexPath.row];
        [self.selectArray removeObject:str];
    }
    
    - (void)editAction:(UIBarButtonItem *)item{
        if ([item.title isEqualToString:@"编辑"]) {
            if (self.dataArray.count == 0) {
                return;
            }
            item.title = @"取消";
            [self.tableView setEditing:YES animated:YES];
        }else{
            item.title = @"编辑";
            [self.tableView setEditing:NO animated:YES];
            
        }
        NSLog(@">>>>>>>>>>selectArrayCount : %lu",self.selectArray.count);
    }
    
    - (NSMutableArray *)dataArray{
        if (!_dataArray) {
            _dataArray = [NSMutableArray array];
        }
        return _dataArray;
    }
    
    - (NSMutableArray *)selectArray{
        if (!_selectArray) {
            _selectArray = [NSMutableArray array];
        }
        return _selectArray;
    }
    
    - (void)didReceiveMemoryWarning {
        [super didReceiveMemoryWarning];
        // Dispose of any resources that can be recreated.
    }
    
    /*
    #pragma mark - Navigation
    
    // In a storyboard-based application, you will often want to do a little preparation before navigation
    - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
        // Get the new view controller using [segue destinationViewController].
        // Pass the selected object to the new view controller.
    }
    */
    
    @end
    

    Demo在这里下载

    总结

    以上就是对TableView单选和多选的一些总结,如果有写的不好的地方,请多多指正。

    相关文章

      网友评论

          本文标题:iOS TableView的单选和多选

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