iOS tableviewCell的多行選擇刪除和全選刪除

 

 

記錄一下項目中遇到的tableviewCell多行選擇刪除和全選刪除。數組

效果圖如上圖服務器

1 首先 建立數組ide

2 建立tableview spa

self.tableView.editing = NO;//默認tableview的editing 是不開啓的代理

3 全選和多選 刪除按鈕code

//選擇按鈕orm

UIButton *selectedBtn = [UIButton buttonWithType:UIButtonTypeSystem];索引

selectedBtn.frame = CGRectMake(0, 0, 60, 30);事件

[selectedBtn setTitle:@"選擇" forState:UIControlStateNormal];ip

[selectedBtn addTarget:self action:@selector(selectedBtn:) forControlEvents:UIControlEventTouchUpInside];

UIBarButtonItem *selectItem = [[UIBarButtonItem alloc] initWithCustomView:selectedBtn];

self.navigationItem.rightBarButtonItem =selectItem;

//        全選

_selectAllBtn = [UIButton buttonWithType:UIButtonTypeSystem];

_selectAllBtn.frame = CGRectMake(0, 0, 60, 30);

[_selectAllBtn setTitle:@"全選" forState:UIControlStateNormal];

[_selectAllBtn addTarget:self action:@selector(selectAllBtnClick:) forControlEvents:UIControlEventTouchUpInside];

UIBarButtonItem *leftItem = [[UIBarButtonItem alloc] initWithCustomView:_selectAllBtn];

self.navigationItem.leftBarButtonItem = leftItem;

_selectAllBtn.hidden = YES;

_baseView = [[UIView alloc] initWithFrame:CGRectMake(0, self.view.frame.size.height- 60, self.view.frame.size.width, 60)];

_baseView.backgroundColor = [UIColor grayColor];

[self.view addSubview:_baseView];

//刪除按鈕

_deleteBtn = [UIButton buttonWithType:UIButtonTypeCustom];

_deleteBtn.backgroundColor = [UIColor redColor];

[_deleteBtn setTitle:@"刪除" forState:UIControlStateNormal];

_deleteBtn.frame = CGRectMake(0, 0, self.view.frame.size.width, 60);

[_deleteBtn addTarget:self action:@selector(deleteClick:) forControlEvents:UIControlEventTouchUpInside];

[_baseView addSubview:_deleteBtn];

4 tableview的delegate和datasource

//是否能夠編輯  默認的時YES

-(BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath{

return YES;

}

//選擇編輯的方式,按照選擇的方式對錶進行處理

-(void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath{

if (editingStyle == UITableViewCellEditingStyleDelete) {//刪除

//真正項目中作刪除

//1.將表中的cell刪除

//2.將本地的數組中數據刪除

//3.最後將服務器端的數據刪除

}

}

//選擇你要對錶進行處理的方式  默認是刪除方式

-(UITableViewCellEditingStyle)tableView:(UITableView *)tableView editingStyleForRowAtIndexPath:(NSIndexPath *)indexPath{

return UITableViewCellEditingStyleDelete | UITableViewCellEditingStyleInsert;

}

******//選中時將選中行的在self.dataArray 中的數據添加到刪除數組self.deleteArr中

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{

[self.deleteArr addObject:[self.dataArray objectAtIndex:indexPath.row]];

}

******//取消選中時 將存放在self.deleteArr中的數據移除

- (void)tableView:(UITableView *)tableView didDeselectRowAtIndexPath:(NSIndexPath *)indexPath  {

[self.deleteArr removeObject:[self.dataArray objectAtIndex:indexPath.row]];

}

實現完tableview的代理方法 下面處理各個按鈕的響應事件

1 首先是選擇按鈕的響應事件 在按鈕事件裏面要有self.tableView.allowsMultipleSelectionDuringEditing = YES; 容許支持同時選中多行

而後在點擊的時候讓tableview.editing = !tableview.editing 點擊此按鈕可切換tableview的編輯狀態

- (void)selectedBtn:(UIButton *)button {

//支持同時選中多行

self.tableView.allowsMultipleSelectionDuringEditing = YES;

self.tableView.editing = !self.tableView.editing;

if (self.tableView.editing) {

_selectAllBtn.hidden = NO;

[button setTitle:@"完成" forState:UIControlStateNormal];

}else{

_selectAllBtn.hidden = YES;

[button setTitle:@"刪除" forState:UIControlStateNormal];

}

}

 

2 全選按鈕的響應事件

點擊全選按鈕時 要在這裏選中全部的cell 我在網上看到不少資料都是選中當前可見的cell 咱們項目要求是所有cell ,因此在這裏我這樣去作 在self.dataArray裏面遍歷, 而後找到對應的一共多少行, 獲取索引值 indexPath,tableview有系統方法 [self.tableView selectRowAtIndexPath:indexPath animated:YES scrollPosition:UITableViewScrollPositionTop]; 選擇所有的cell  此時在這個全選方法中將數據源self.dataArray的全部數據所有添加到self.deleteArr (存儲刪除數據的數組中)

//全選

- (void)selectAllBtnClick:(UIButton *)button {

//    [self.tableView reloadData];

for (int i = 0; i < self.dataArray.count; i ++) {

NSIndexPath *indexPath = [NSIndexPath indexPathForItem:i inSection:0];

[self.tableView selectRowAtIndexPath:indexPath animated:YES scrollPosition:UITableViewScrollPositionTop];

[self.deleteArr addObjectsFromArray:self.dataArray];

}

NSLog(@"self.deleteArr:%@", self.deleteArr);

}

3 刪除按鈕的處理事件

不管是多行刪除仍是所有刪除的數據對tableview的操做都是走這個delete方法的。在方法中判斷當前的tableview是否處於編輯狀態。而後再執行刪除操做,關鍵點就是將數據源self.dataArray中的要刪除的數據移除,以前咱們的多選或者全選已經將咱們要刪除的數據存儲在self.deleteArr中了 ,因此在這裏咱們用[self.dataArray removeObjectsInArray:self.deleteArr];這個方法操做 而後刷新tableview。至此就能夠實現功能了。

 

- (void)deleteClick:(UIButton *) button {

if (self.tableView.editing) {

//刪除

[self.dataArray removeObjectsInArray:self.deleteArr];

[self.tableView reloadData];

}

else return;

}

 

總結 :這裏面一共有如下幾個點 

1 在多選刪除時 在didSelectRowAtIndexPath這個方法中,根據cell所在行的索引值將此行的數據存到self.deleteArr中 [self.deleteArr addObject:[self.dataArray objectAtIndex:indexPath.row]];

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{

}

當取消刪除時,要將self.deleteArr中的數據移除,否則會形成 (你先選中一行 而後取消選中 可是當你點擊刪除按鈕時,這行cell仍是會被刪除)

- (void)tableView:(UITableView *)tableView didDeselectRowAtIndexPath:(NSIndexPath *)indexPath  {

}

2 在全選時。將self.dataArr 中的所有數據都賦值給self.deleteArr

NSIndexPath *indexPath = [NSIndexPath indexPathForItem:i inSection:0];

[self.tableView selectRowAtIndexPath:indexPath animated:YES scrollPosition:UITableViewScrollPositionTop];

[self.deleteArr addObjectsFromArray:self.dataArray];

3 執行刪除操做時,將self.dataArr中包含self.deleteArr的數據移除

self.dataArray removeObjectsInArray:self.deleteArr];

[self.tableView reloadData];

 

後記:還有一個在cell中添加長按手勢 使tableview進入編輯狀態

在-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 方法中 爲cell添加長按手勢

UILongPressGestureRecognizer *longPressed = [[UILongPressGestureRecognizer alloc]initWithTarget:self action:@selector(longPressedAct:)];

longPressed.minimumPressDuration = 1;

[cell.contentView addGestureRecognizer:longPressed];

 

實現長按手勢的響應方法:

-(void)longPressedAct:(UILongPressGestureRecognizer *)gesture

{

if(gesture.state == UIGestureRecognizerStateBegan)

{

CGPoint point = [gesture locationInView:self.tableView];

NSIndexPath * indexPath = [self.tableView indexPathForRowAtPoint:point];

if(indexPath == nil) return ;

//add your code here

self.tableView.editing = YES;

}

}

Markdown模式連接

相關文章
相關標籤/搜索