码迷,mamicode.com
首页 > 其他好文 > 详细

TableView实现多选的方法

时间:2015-10-15 14:33:45      阅读:221      评论:0      收藏:0      [点我收藏+]

标签:

  正如现在许多app上许多多选功能,多选删除,多选添加等等。我以tableView为载体,表现一下这些功能做法的思路。知识在于活学活用,希望你能有所感悟。从原理去理解。

 一,先看一个简单的功能需求。

技术分享

    像上面这么种需求,只需要利用tableView自带的编辑模式就可以实现了,废话不多说,直接上代码。

注意:

   1,tableView是从ib中拖进去的

   2,给ib加了一个navigationController

   3,ib内容如下

技术分享

技术分享
//
//  ViewController.h
//  tabView的编辑模式
//
//  Created by Mac on 15-7-15.
//  Copyright (c) 2015年 Mac. All rights reserved.
//

#import <UIKit/UIKit.h>

@interface ViewController : UIViewController<UITableViewDelegate,UITableViewDataSource
>


@property (weak, nonatomic) IBOutlet UITableView *table;
@end
ViewController.h
技术分享
//
//  ViewController.m
//  tabView的编辑模式
//
//  Created by Mac on 15-7-15.
//  Copyright (c) 2015年 Mac. All rights reserved.
//

#import "ViewController.h"

@interface ViewController ()
@property(nonatomic,strong)NSMutableArray *dataList;
@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    _table.delegate = self;
    _table.dataSource = self;
    [self loadData];
    //是否支持多选模式
    self.table.allowsMultipleSelectionDuringEditing = YES;
    //创建navigation上的左右按钮
    [self allocButton];
}

//设置数据原
- (void)loadData{
    _dataList = [NSMutableArray arrayWithObjects:@"大大大",@"小小小",@"牛牛牛牛",@"羊羊羊羊",@"狗狗狗", nil];
}
//设置行
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{
    return _dataList.count;
}
//设置cell的内容
- (UITableViewCell*)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"cell"];
    if (cell == nil) {
        cell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"cell"];
    }
    cell.textLabel.text = _dataList[indexPath.row];
    
    return cell;
}
//是否可以打开编辑模式
- (BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath{
    //指定某一行,不能编辑
//    if (indexPath.row == 0) {
//        return NO;
//    }
    return YES;
}
//创建navigation上的左右按钮
- (void)allocButton{
    UIBarButtonItem *leftButton = [[UIBarButtonItem alloc]initWithTitle:@"删除" style:UIBarButtonItemStylePlain target:self action:@selector(leftButtonAction:)];
    self.navigationItem.leftBarButtonItem = leftButton;
    UIBarButtonItem *rightButton = [[UIBarButtonItem alloc]initWithTitle:@"编辑" style:UIBarButtonItemStylePlain target:self action:@selector(rightButtonAction:)];
    self.navigationItem.rightBarButtonItem = rightButton;
}
//单选模式时其内容不能用
//删除按钮调用的方法
- (void)leftButtonAction:(UIBarButtonItem*)button{

    //取出选择的单元格路径
    NSArray *selectIndexPaths = _table.indexPathsForSelectedRows;
    //创建一个数组用来存放所要删除的对象
    NSMutableArray *deletData = [[NSMutableArray alloc]init];
    //遍历路径取出所要删除的对象
    for (NSIndexPath *index in selectIndexPaths) {
        NSString *data = _dataList[index.row];
        [deletData addObject:data];
    }
    
    [_dataList removeObjectsInArray:deletData];
//    [_table reloadData];  
        //添加删除动画,这时不需要再重新reloadData
    [_table deleteRowsAtIndexPaths:selectIndexPaths withRowAnimation:UITableViewRowAnimationFade];

}
//编辑按钮调用的方法
- (void)rightButtonAction:(UIBarButtonItem*)button{
    //打开编辑模式   有动画效果
    BOOL editing = _table.editing;
    [self.table setEditing:!editing animated:YES];
//无动画效果    self.table.editing = YES;
    
}



- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

@end
ViewController.m

 

 

 

 

    第二种,自定义实现多选,做的稍微粗糙了写,先看效果图

 

技术分享

 

   类似上面这种需求,稍微比较复杂了,有兴趣和需求的,可以试着自己做一下,然后封装出来.

 

  注意:

   1,tableView的cell是子类化出来的

   2,每组的头视图是子类化出来的

   3,子类化ib如下

1).storyboard   

技术分享

 2),tableView  ib

技术分享

3), 头视图ib

技术分享

技术分享
//
//  ViewController.h
//  TableViwMoreSelectDemo
//
//  Created by Mac on 15-10-14.
//  Copyright (c) 2015年 Mac. All rights reserved.
//

#import <UIKit/UIKit.h>

@interface ViewController : UIViewController<UITableViewDataSource,UITableViewDelegate>


@end
ViewController.h
技术分享
//
//  ViewController.m
//  TableViwMoreSelectDemo
//
//  Created by Mac on 15-10-14.
//  Copyright (c) 2015年 Mac. All rights reserved.
//

#import "ViewController.h"
#import "SectionView.h"
#import "NewTableViewCell.h"

@interface ViewController ()

{
    //是否是编辑状态
    BOOL isEnding;
    //旧组数
    NSInteger oldSection;
    //组数
    int sectionCount;
    //行数
    int cellCount;

}

@property (weak, nonatomic) IBOutlet UITableView *tableV;

@property(nonatomic,strong)NSMutableArray *BOOLArray;
//用来判断组的选择状态
@property(nonatomic,strong)NSMutableArray *sectionBOOLArray;
//用来判断行的选择状态
@property(nonatomic,strong)NSMutableArray *cellBOOLArray;
//用来判断组中全选button的selected
@property(nonatomic,strong)NSMutableArray *boolAllButton;

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    sectionCount = 6;
    cellCount = 10;
    isEnding = NO;
    oldSection = 100;
    _BOOLArray = [[NSMutableArray alloc] init];
    _sectionBOOLArray = [[NSMutableArray alloc] init];
    _boolAllButton = [[NSMutableArray alloc] init];
    
    _tableV.delegate = self;
    _tableV.dataSource = self;
    //打开多选编辑
//    _tableV.allowsMultipleSelectionDuringEditing = YES;
 
    [self addButtonInNavigationBar];
}


#pragma mark添加导航栏上的按钮
- (void)addButtonInNavigationBar{
    
    UIBarButtonItem *leftButton = [[UIBarButtonItem alloc] initWithTitle:@"编辑" style:UIBarButtonItemStylePlain target:self action:@selector(navigationBarLeftButtonAction:)];
    //加入到导航控制器中
    self.navigationItem.leftBarButtonItem = leftButton;
    
    UIBarButtonItem *rightButton = [[UIBarButtonItem alloc] initWithTitle:@"添加" style:UIBarButtonItemStylePlain target:self action:@selector(navigationBarRightButtonAction:)];
    //加入到导航控制器中
    self.navigationItem.rightBarButtonItem = rightButton;
    
    [self buttonSectiondInsectionAndRows];
    
}
//行上button的选中状态
- (void)buttonSectiondInsectionAndRows{
    
    //行上button的选中状态
    for (int i = 0; i<sectionCount; i++) {
        
        BOOL isAll = NO;
        [_boolAllButton addObject:[NSNumber numberWithBool:isAll]];
        
        _cellBOOLArray = [[NSMutableArray alloc] init];
        for (int j = 0; j<cellCount; j++) {
            
            BOOL isSelected = NO;
            [_cellBOOLArray addObject:[NSNumber numberWithBool:isSelected]];
            
        }
        
        [_sectionBOOLArray addObject:_cellBOOLArray];
    }

    
}

- (void)navigationBarLeftButtonAction:(UIBarItem *)button{

    isEnding = !isEnding;
    
    
    if (isEnding == NO) {
        
        _boolAllButton = [[NSMutableArray alloc] init];
        _sectionBOOLArray = [[NSMutableArray alloc] init];
        [self buttonSectiondInsectionAndRows];
        
        button.title = @"编辑";
    }else{
        
        button.title = @"退出";
    }
    
    [_tableV reloadData];

//    [_tableV setEditing:isEnding animated:YES];
    
    
}
- (void)navigationBarRightButtonAction:(UIBarItem *)button{
    
   
}



- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{
    if ([_BOOLArray[section] boolValue] == YES) {
        
        return cellCount;
    }
    
    return 0;
}

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath{
    
    return 80;
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{

    NewTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"cell"];
    if (!cell) {
        
        cell = [[[NSBundle mainBundle] loadNibNamed:@"NewTableViewCell" owner:self options:nil] lastObject];
        
    }
    
    cell.chiceORsell.hidden = !isEnding;
    cell.chiceORsell.selected = [_sectionBOOLArray[indexPath.section][indexPath.row] boolValue];
    cell.chiceORsell.tag = indexPath.section *1000 +indexPath.row;
    [cell.chiceORsell addTarget:self action:@selector(cellChiceButtonAction:) forControlEvents:UIControlEventTouchUpInside];
    
    cell.textLabel.text = [NSString stringWithFormat:@"%ld",indexPath.row+1];
    
    return cell;
}


#pragma mark 行上选择按钮调用的方法
- (void)cellChiceButtonAction:(UIButton *)button{
    

    BOOL isSelected = [_sectionBOOLArray[button.tag/1000][button.tag%1000] boolValue];
    
    isSelected = !isSelected;

    button.selected = isSelected;
    
    _sectionBOOLArray[button.tag/1000][button.tag%1000] = [NSNumber numberWithBool:isSelected];
    
    
        //用来判断每组中行的选中状态的button的数量
        int selectedCount = 0;
        //用来判断组全选按钮的状态
        BOOL sectionButtonSeclection = [_boolAllButton[button.tag/1000] boolValue];
        for (int j = 0; j < cellCount; j++) {
            //取出对应的button判断其selected
            BOOL selected = [_sectionBOOLArray[button.tag/1000][j] boolValue];
            NSArray *array = _sectionBOOLArray[button.tag/1000];
            if (selected == YES) {
                
                selectedCount++;
                
                if(selectedCount == array.count ){
                    
                    _boolAllButton[button.tag/1000] = [NSNumber numberWithBool:YES];
                    if (sectionButtonSeclection == NO) {
                        
                        [_tableV reloadData];
                        
                    }
                    
                }else{
                    
                    _boolAllButton[button.tag/1000] = [NSNumber numberWithBool:NO];
                    
                    if (sectionButtonSeclection == YES) {
                        
                        [_tableV reloadData];
                        
                    }
                }
                
            }
        
        
    }
    
}

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView{
    
    for (int i =0 ; i<sectionCount; i++) {
        
        BOOL isOpen = YES;
        
        NSNumber *isO = [NSNumber numberWithBool:isOpen];
        
        [_BOOLArray addObject:isO];
        
    }
    
    
    return sectionCount;
}

#pragma mark自定义组的内容
- (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section{
    
    SectionView *view = [[[NSBundle mainBundle] loadNibNamed:@"SectionView" owner:self options:nil] lastObject];
    
    [view.allButton addTarget:self action:@selector(allButton:) forControlEvents:UIControlEventTouchUpInside];
    
    view.allButton.tag = 100+section;
    view.allButton.hidden = !isEnding;
    view.allButton.selected = [_boolAllButton[section] boolValue];
    
    view.titleLabel.text = [NSString stringWithFormat:@"第%ld组",section+1];
    
    
    [view.openORclose addTarget:self action:@selector(sectionButtonAction:) forControlEvents:UIControlEventTouchUpInside];
    view.openORclose.tag = 100+section;
    
    return view;
}
#pragma mark收起按钮调用的方法
- (void)sectionButtonAction:(UIButton *)button{
    
    BOOL isOpen = [_BOOLArray[button.tag - 100] boolValue];
    isOpen = !isOpen;
    _BOOLArray[button.tag - 100] = [NSNumber numberWithBool:isOpen];

    [_tableV reloadData];
    
}
#pragma mark全选按钮调用的方法
- (void)allButton:(UIButton *)button{

    button.selected = !button.selected;
    _boolAllButton[button.tag -100] = [NSNumber numberWithBool:button.selected];

    NSArray *array = _sectionBOOLArray[button.tag - 100];
    for (int i = 0;i<array.count;i++){
        
        NSNumber *boolSelected = array[i];
        BOOL selected = [boolSelected boolValue];
        selected = button.selected;

        _sectionBOOLArray[button.tag - 100][i] = [NSNumber numberWithBool:selected];
        
    }
    [_tableV reloadData];
    
}

- (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section{
    
    return 40;
    
}
#pragma mark row的点击方法
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{
    
    
    
}


@end
ViewController.m
//
//  NewTableViewCell.h
//  TableViwMoreSelectDemo
//
//  Created by Mac on 15-10-15.
//  Copyright (c) 2015年 Mac. All rights reserved.
//

#import <UIKit/UIKit.h>

@interface NewTableViewCell : UITableViewCell


@property (weak, nonatomic) IBOutlet UIButton *chiceORsell;

@end
技术分享
//
//  NewTableViewCell.m
//  TableViwMoreSelectDemo
//
//  Created by Mac on 15-10-15.
//  Copyright (c) 2015年 Mac. All rights reserved.
//

#import "NewTableViewCell.h"

@implementation NewTableViewCell

- (void)awakeFromNib {
    // Initialization code
}

- (void)setSelected:(BOOL)selected animated:(BOOL)animated {
    [super setSelected:selected animated:animated];

    // Configure the view for the selected state
}

@end
NewViewTableViewCell.m
技术分享
//
//  SectionView.h
//  TableViwMoreSelectDemo
//
//  Created by Mac on 15-10-14.
//  Copyright (c) 2015年 Mac. All rights reserved.
//

#import <UIKit/UIKit.h>

@interface SectionView : UIView

@property (weak, nonatomic) IBOutlet UILabel *titleLabel;


@property (weak, nonatomic) IBOutlet UIButton *allButton;

@property (weak, nonatomic) IBOutlet UIButton *openORclose;


@end
SectionView.h
技术分享
//
//  SectionView.m
//  TableViwMoreSelectDemo
//
//  Created by Mac on 15-10-14.
//  Copyright (c) 2015年 Mac. All rights reserved.
//

#import "SectionView.h"

@implementation SectionView


@end
SectionView.m

 

TableView实现多选的方法

标签:

原文地址:http://www.cnblogs.com/zxh-iOS/p/4882225.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!