UITableView自定义多选删除样式
Model.h
<pre>#import <Foundation/Foundation.h>
@interface Model : NSObject
@property(nonatomic,strong)NSString *desc;
+(instancetype)modelWithDesc:(NSString *)desc;
@end</pre>
Model.m
<pre>#import "Model.h"
@implementation Model
+(instancetype)modelWithDesc:(NSString *)desc
{
Model *m=[Model new];
m.desc=desc;
return m;
}
@end</pre>
CustomCell.h
<pre>#import <UIKit/UIKit.h>
@interface CustomCell : UITableViewCell
@property(nonatomic,strong)UILabel *titleLb;
@property(nonatomic,strong)UIButton *selectBtn;
@end</pre>
CustomCell.m
<pre>#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</pre>
EditViewController.h
<pre>#import <UIKit/UIKit.h>
@interface EditViewController : UIViewController
@end</pre>
EditViewController.m
<pre>#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 ()<UITableViewDataSource,UITableViewDelegate>
{
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 in allCells) cell.selectBtn.selected=YES;
}
else
{
[_delArray removeAllObjects];
NSArray *allCells=[_tbView visibleCells];
for(CustomCell *cell in allCells)
cell.selectBtn.selected=NO;
}
[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 *)[self.toolView viewWithTag:100];
selectAllBtn.selected=NO;
[UIView animateWithDuration:0.3 animations:^{
CGFloat ypos=weakSelf.toolView.frame.origin.y;
ypos=kHeight-49;
weakSelf.toolView.frame=CGRectMake(0, ypos, kWidth, 49);
}];
}
//隐藏工具栏
-(void)hideToolView
{
__weak typeof(self) weakSelf=self;
[UIView animateWithDuration:0.3 animations:^{
CGFloat ypos=weakSelf.toolView.frame.origin.y;
ypos=kHeight;
weakSelf.toolView.frame=CGRectMake(0, ypos, kWidth, 49);
}completion:^(BOOL finished) {
weakSelf.toolView.hidden=YES;
}];
}
//刷新删除数量Lb
-(void)refreshDeleteCountLb
{
UILabel *deleteCountLb=(UILabel *)[self.toolView viewWithTag:111];
deleteCountLb.text=[NSString stringWithFormat:@"删除(%ld)",_delArray.count];
}
pragma mark -
pragma mark - UITableView
-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
return _dataArray.count;
}
-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
return 40;
}
-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
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;
return cel;
}
//编辑样式
-(UITableViewCellEditingStyle)tableView:(UITableView *)tableView editingStyleForRowAtIndexPath:(NSIndexPath *)indexPath
{
return UITableViewCellEditingStyleNone;
}
//移动
-(void)tableView:(UITableView *)tableView moveRowAtIndexPath:(NSIndexPath *)sourceIndexPath toIndexPath:(NSIndexPath *)destinationIndexPath
{
//交换数据
[_dataArray exchangeObjectAtIndex:sourceIndexPath.row withObjectAtIndex:destinationIndexPath.row];
}
//选中时执行的逻辑
-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
if(_tbView.isEditing)
{
Model *m=_dataArray[indexPath.row];
if(![_delArray containsObject:m])
{
[_delArray addObject:m];
//若选择了所有行,则将全选标记置为是
if(_delArray.count==_dataArray.count)
{
//全选标记置为是
UIButton *selectAllBtn=(UIButton *)[self.toolView viewWithTag:100];
selectAllBtn.selected=YES;
}
CustomCell *cell=(CustomCell *)[_tbView cellForRowAtIndexPath:indexPath];
cell.selectBtn.selected=YES;
}
else
{
[_delArray removeObject:m];
//全选标记置为否
UIButton *selectAllBtn=(UIButton *)[self.toolView viewWithTag:100];
selectAllBtn.selected=NO;
//置为未选中
CustomCell *cell=(CustomCell *)[_tbView cellForRowAtIndexPath:indexPath];
cell.selectBtn.selected=NO;
}
//刷新删除数Lb
[self refreshDeleteCountLb];
}
}
@end
</pre>
Appdelegate.m
<pre>
#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;
}</pre>
<pre>
最后附上GitHub源码地址
</pre>