TableView实现多选的方法

正如现在许多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

时间: 2024-10-07 19:36:20

TableView实现多选的方法的相关文章

UITableViewController子类分离self.tableView和self.view的方法

当一个view上显示的内容能够用一个UITableView实现,可以通过子类化一个UITableViewController控制器,上面提供了一个UITableView对象,不需要自己维护其frame,使用起来还是挺方便的.但是当在该控制器的view上添加其他的视图时,会出现无论如何都会添加的self.tableView上,原因是在UITableViewController子类中,self.view和self.tableView都是同一个对象,都是一个UITableView.本文主要是分离sel

ios7 tableview scrollsToTop 不执行处理方法

ios7中调用[self.tableview scrollsToTop] 没有效果(ios8中也没有效果) stackflow 处理方法: [self.tableviewscrollRectToVisible:CGRectMake(0, 0, 1, 1) animated:YES]; 或者implement the UIScrollViewDelegate method scrollViewShouldScrollToTop: - (BOOL) scrollViewShouldScrollToT

在UITableViewStylePlain情况下sectionHeader可以与tableview一起滑动的解决方法

-(void)scrollViewDidScroll:(UIScrollView *)scrollView { CGFloat sectionHeaderHeight = 20; if (scrollView.contentOffset.y <= sectionHeaderHeight&&scrollView.contentOffset.y > 0) { scrollView.contentInset = UIEdgeInsetsMake(-scrollView.content

highcharts 图例全选按钮方法

$('#uncheckAll').click(function(){ var chart = $('#container').highcharts(); var series = chart.series; for(i=0; i < chart.series.length; i++) { series[i].setVisible(false, false); } chart.redraw(); }); $('#checkAll').click(function(){ var chart = $(

tableview 代理方法详解

typedef NS_ENUM(NSInteger, UITableViewCellAccessoryType) { UITableViewCellAccessoryNone, // 不显示任何图标 UITableViewCellAccessoryDisclosureIndicator, // 跳转指示图标 UITableViewCellAccessoryDetailDisclosureButton, // 内容详情图标和跳转指示图标 UITableViewCellAccessoryCheckm

【COCOS2DX-游戏开发之三四】cocos2dx 3.0 TableView特殊使用方法:滚动时不能选择等等

cocos2dx 3.0版本号TableView拍生自ScrollView,经常使用来做滚动列表,有几种特殊使用方法,不知道大家用到过没 要求:1.滚动时不能选中TableCell,非滚动状态才干选中 非常easy,在TableView的delegate函数中,通过isTouchMoved()函数来推断 void WeaponSelectLayer::tableCellUnhighlight(cocos2d::extension::TableView* table, cocos2d::exten

UITableView-MultiSelect列表视图多选并删除

1.创建导航栏 2.创建数据源 3.在按钮的编辑响应事件方法中让tableview可以多选可以和可以编辑 4.在按钮删除的响应事件方法中,对选择的数组进行排序后删除,然后设置回不可多选和编辑 //.h文件中继承UITableViewController//  MyTableViewController.h//  UITableView-2-MultiSelect////  Created by hehe on 15/9/28.//  Copyright (c) 2015年 wang.hehe.

IOS-UITableView开发常用各种方法总结

实现列表有两种方式 方式一 继承UIViewController,实现UITableViewDataSource和UITableViewDelegate协议.声明UITableView. UserInfoViewController.h @interface UserInfoViewController : UIViewController<UITableViewDataSource,UITableViewDelegate>{ } @end UserInfoViewController.m @

重用cell的两种方法

今天在学习IAP的时候无意间看到原来  tableView: cellForRowAtIndexPath:方法中有两个获得重用cell的方法 ,一直以来都是用 UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];那下面的这个怎么用呢,感觉比较怪,假设没有重用的岂不是为空了 UITableViewCell *cell = [tableView dequeueReusableCell