UITableView自定义多选删除样式

Model.h

#import 
@interface Model : NSObject
@property(nonatomic,strong)NSString *desc;
+(instancetype)modelWithDesc:(NSString *)desc;
@end
Model.m
#import "Model.h"

@implementation Model

+(instancetype)modelWithDesc:(NSString *)desc
{
    Model *m=[Model new];
    m.desc=desc;
    return m;
}
@end
CustomCell.h
#import 

@interface CustomCell : UITableViewCell

@property(nonatomic,strong)UILabel *titleLb;
@property(nonatomic,strong)UIButton *selectBtn;

@end
CustomCell.m
#import "CustomCell.h"
#define kWidth ([UIScreen mainScreen].bounds.size.width)

@implementation CustomCell

- (void)awakeFromNib {
}

- (void)setSelected:(BOOL)selected animated:(BOOL)animated {
    [super setSelected:selected animated:animated];
}
-(id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier
{
    if(self=[super initWithStyle:style reuseIdentifier:reuseIdentifier])
    {
        self.backgroundColor=[UIColor blackColor];
        [self createUI];
        self.selectionStyle=UITableViewCellSelectionStyleNone;
    }
    return self;
}
-(void)createUI
{
    for(UIView *sub in self.contentView.subviews)
        [sub removeFromSuperview];

    //选择按钮
    self.selectBtn=[[UIButton alloc]initWithFrame:CGRectMake(-20, 10, 20, 20)];
    [self.selectBtn setImage:[UIImage imageNamed:@"un_select"] forState:UIControlStateNormal];
    [self .selectBtn setImage:[UIImage imageNamed:@"select"] forState:UIControlStateSelected];
    [self.contentView addSubview:self.selectBtn];
    //默认隐藏
    self.selectBtn.hidden=YES;

    // 标题Lb
    self.titleLb=[[UILabel alloc]initWithFrame:CGRectMake(20, 0,kWidth-40, 40)];
    self.titleLb.textColor=[UIColor whiteColor];
    [self.contentView addSubview:self.titleLb];
}
@end
EditViewController.h
#import 

@interface EditViewController : UIViewController

@end
EditViewController.m
#import "EditViewController.h"
#import "CustomCell.h"
#import "Model.h"

#define kWidth ([UIScreen mainScreen].bounds.size.width)
#define kHeight ([UIScreen mainScreen].bounds.size.height)
#define RGB(r,g,b) ([UIColor colorWithRed:(r)/255.0f green:(g)/255.0f blue:(b)/255.0f alpha:1.0f])

@interface EditViewController ()
{
    UITableView *_tbView;
    NSMutableArray *_dataArray;
    NSMutableArray *_delArray;
}
//底部工具栏
@property(nonatomic,strong)UIView *toolView;

@end

@implementation EditViewController

- (void)viewDidLoad
{
    [super viewDidLoad];
    [self setUp];
    [self initDataArray];
    [self createTbView];
    [self createBottomTools];
}
//初始设置
-(void)setUp
{
    self.automaticallyAdjustsScrollViewInsets=NO;
    //导航视图
    UIView *naviView=[[UIView alloc]initWithFrame:CGRectMake(0, 0, kWidth, 64)];
    naviView.backgroundColor=RGB(157, 25, 36);
    [self.view addSubview:naviView];
    //导航栏标题
    UILabel *titleLb=[[UILabel alloc]initWithFrame:CGRectMake(0, 20, kWidth, 44)];
    titleLb.text=@"编辑分组";
    titleLb.textColor=[UIColor whiteColor];
    titleLb.textAlignment=NSTextAlignmentCenter;
    titleLb.font=[UIFont systemFontOfSize:20];
    [naviView addSubview:titleLb];
    //编辑按钮
    UIButton *rightBtn=[[UIButton alloc]initWithFrame:CGRectMake(kWidth-60, 27, 40, 30)];
    [rightBtn setTitle:@"编辑" forState:UIControlStateNormal];
    [rightBtn setTitle:@"完成" forState:UIControlStateSelected];
    [rightBtn addTarget:self action:@selector(editAction:) forControlEvents:UIControlEventTouchUpInside];
    [self.view addSubview:rightBtn];
}
//初始化数组
-(void)initDataArray
{
    //初始化数据源数组
    _dataArray=[NSMutableArray array];

    [_dataArray addObject:[Model modelWithDesc:@"我的自选"]];
    [_dataArray addObject:[Model modelWithDesc:@"我关注的牛股"]];
    [_dataArray addObject:[Model modelWithDesc:@"环保牛股"]];
    //初始化删除数组
    _delArray=[NSMutableArray array];
}
//点击编辑按钮执行的方法
-(void)editAction:(UIButton *)sender
{
    [_tbView setEditing:!_tbView.isEditing animated:YES];
    sender.selected=!sender.isSelected;

    if(sender.isSelected)
    {
        NSArray *allCells=[_tbView visibleCells];
        for(CustomCell *cell in allCells)
        {
            cell.selectBtn.hidden=NO;
            cell.selectBtn.selected=NO;
        }
        //显示底部toolView
        [self showToolView];
    }
    else
    {
        NSArray *allCells=[_tbView visibleCells];
        for(CustomCell *cell in allCells)
            cell.selectBtn.hidden=YES;

        //隐藏底部toolView
        [self hideToolView];

        //执行删除
        [_dataArray removeObjectsInArray:_delArray];
        //清空删除数组
        [_delArray removeAllObjects];
        //刷新表视图
        [_tbView reloadData];
    }
}
//表视图
-(void)createTbView
{
    _tbView=[[UITableView alloc]initWithFrame:CGRectMake(0, 64, kWidth, kHeight-64)];
    _tbView.delegate=self;
    _tbView.dataSource=self;
    _tbView.backgroundColor=[UIColor blackColor];
    _tbView.separatorColor=[UIColor whiteColor];
    _tbView.separatorStyle=UITableViewCellSeparatorStyleSingleLine;
    [self.view addSubview:_tbView];
    _tbView.scrollEnabled=NO;
    _tbView.allowsSelectionDuringEditing=YES;
    _tbView.tableFooterView=[UIView new];
}
//底部工具栏
-(void)createBottomTools
{
    _toolView=[[UIView alloc]initWithFrame:CGRectMake(0, kHeight, kWidth, 49)];
    _toolView.backgroundColor=[UIColor darkGrayColor];
    [self.view addSubview:_toolView];

    //全选按钮
    UIButton *selectAllBtn=[[UIButton alloc]initWithFrame:CGRectMake(10, 14.5, 20, 20)];
    [selectAllBtn setImage:[UIImage imageNamed:@"un_all_select"] forState:UIControlStateNormal];
    [selectAllBtn setImage:[UIImage imageNamed:@"select"] forState:UIControlStateSelected];
    [selectAllBtn addTarget:self action:@selector(selectAllRows:) forControlEvents:UIControlEventTouchUpInside];
    selectAllBtn.tag=100;
    [_toolView addSubview:selectAllBtn];

    //去选lb
    UILabel *selectAllLb=[[UILabel alloc]initWithFrame:CGRectMake(CGRectGetMaxX(selectAllBtn.frame)+5, 14.5, 40, 20)];
    selectAllLb.textColor=[UIColor whiteColor];
    selectAllLb.text=@"全选";
    selectAllLb.textAlignment=NSTextAlignmentCenter;
    [_toolView addSubview:selectAllLb];

    //删除数量
    UILabel *deleteCountLb=[[UILabel alloc]initWithFrame:CGRectMake(kWidth-70, 14.5, 60, 20)];
    deleteCountLb.text=@"删除(0)";
    deleteCountLb.textAlignment=NSTextAlignmentCenter;
    deleteCountLb.textColor=[UIColor whiteColor];
    deleteCountLb.tag=111;
    [_toolView addSubview:deleteCountLb];

    //默认隐藏
    _toolView.hidden=YES;
}
//全选
-(void)selectAllRows:(UIButton *)sender
{
    sender.selected=!sender.isSelected;
    if(_delArray.count<_dataarray.count) {="" for(model="" *m="" in="" _dataarray)="" if(![_delarray="" containsobject:m])="" [_delarray="" addobject:m];="" }="" nsarray="" *allcells="[_tbView" visiblecells];="" for(customcell="" *cell="" allcells)="" cell.selectbtn.selected="YES;" else="" removeallobjects];="" [self="" refreshdeletecountlb];="" 显示工具栏="" -(void)showtoolview="" __weak="" typeof(self)="" weakself="self;" uilabel="" *deletecountlb="(UILabel" *)[self.toolview="" viewwithtag:111];="" deletecountlb.text="@"删除(0)";" self.toolview.hidden="NO;" 全选标记置为否="" uibutton="" *selectallbtn="(UIButton" viewwithtag:100];="" selectallbtn.selected="NO;" [uiview="" animatewithduration:0.3="" animations:^{="" cgfloat="" ypos="weakSelf.toolView.frame.origin.y;" weakself.toolview.frame="CGRectMake(0," ypos,="" kwidth,="" 49);="" }];="" 隐藏工具栏="" -(void)hidetoolview="" }completion:^(bool="" finished)="" weakself.toolview.hidden="YES;" 刷新删除数量lb="" -(void)refreshdeletecountlb="" stringwithformat:@"删除(%ld)",_delarray.count];="" #pragma="" mark="" -="" uitableview="" -(nsinteger)tableview:(uitableview="" *)tableview="" numberofrowsinsection:(nsinteger)section="" return="" _dataarray.count;="" -(cgfloat)tableview:(uitableview="" heightforrowatindexpath:(nsindexpath="" *)indexpath="" 40;="" -(uitableviewcell="" *)tableview:(uitableview="" cellforrowatindexpath:(nsindexpath="" static="" nsstring="" *cid="@"cid";" customcell="" *cel="[tableView" dequeuereusablecellwithidentifier:cid];="" if(!cel)="" cel="[[CustomCell" alloc]initwithstyle:uitableviewcellstyledefault="" reuseidentifier:cid];="" model="" *model="_dataArray[indexPath.row];" cel.titlelb.text="model.desc;" cel;="" 编辑样式="" -(uitableviewcelleditingstyle)tableview:(uitableview="" editingstyleforrowatindexpath:(nsindexpath="" uitableviewcelleditingstylenone;="" 移动="" -(void)tableview:(uitableview="" moverowatindexpath:(nsindexpath="" *)sourceindexpath="" toindexpath:(nsindexpath="" *)destinationindexpath="" 交换数据="" [_dataarray="" exchangeobjectatindex:sourceindexpath.row="" withobjectatindex:destinationindexpath.row];="" 选中时执行的逻辑="" didselectrowatindexpath:(nsindexpath="" if(_tbview.isediting)="" 若选择了所有行,则将全选标记置为是="" if(_delarray.count="=_dataArray.count)" 全选标记置为是="" *)[_tbview="" cellforrowatindexpath:indexpath];="" removeobject:m];="" 置为未选中="" 刷新删除数lb="" @end="" <="" pre="">
Appdelegate.m
#import "AppDelegate.h"
#import "EditViewController.h"
@interface AppDelegate ()
@end
@implementation AppDelegate
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    EditViewController *edit=[EditViewController new];
    UINavigationController *navi=[[UINavigationController alloc]initWithRootViewController:edit];
    navi.navigationBar.hidden=YES;
    navi.navigationBar.barStyle=UIBarStyleBlack;
    self.window.rootViewController=navi;
    return YES;
}

效果图
最后附上GitHub源码地址