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