iOS 多選刪除(附tableViewTips及單選刪除)

王隆帥發表於2019-02-18

一、前言

這次分享並記錄一下tableView的多選刪除,並額外記錄一下cell的設定小技巧。

二、想要實現的效果圖如下:

1、先上原圖

2、然後編輯圖如下

3、編輯步驟:

**- 點選右上角按鈕編輯,介面呈現編輯狀態底部刪除按鈕彈出

  • 選擇刪除cell項,點選右下角刪除可刪除
  • 點選右上角,退出編輯狀態,底部刪除按鈕退出介面**

三、多選刪除核心程式碼

1、設定允許tableView編輯狀態下允許多選

_mainTableView.allowsMultipleSelectionDuringEditing = YES;複製程式碼

2、將cell設定為可選擇的風格(下面程式碼是在自定義Cell內部)

self.selectionStyle = UITableViewCellSelectionStyleDefault;複製程式碼

說明:因為自認為系統的選中狀態很難看,所以在cell的基類裡已經把 selectionStyle 設定為None,但是想要多選必須將其開啟,大家切記。

3、不喜歡系統的選中狀態,可更改選中狀態的背景(下面也是在自定義cell內部)

 UIView *view = [[UIView alloc] init];
 view.backgroundColor = UIColorFromRGB(0xF6F6F6);
 self.selectedBackgroundView = view;複製程式碼

4、右上角點選事件

 [self.viewModel.rightViewModel.clickSubject subscribeNext:^(id x) {

        @strongify(self);

        if (self.mainTableView.editing) {

            self.viewModel.rightViewModel.title = @"編輯";

            [UIView animateWithDuration:0.5 animations:^{

                [self.mainTableView mas_remakeConstraints:^(MASConstraintMaker *make) {

                    @strongify(self);
                    make.edges.equalTo(self);
                }];

            }];

        } else {

            self.viewModel.rightViewModel.title = @"確定";

            [UIView animateWithDuration:0.5 animations:^{

                [self.mainTableView mas_remakeConstraints:^(MASConstraintMaker *make) {

                    @strongify(self);
                    make.left.right.top.equalTo(self);
                    make.bottom.equalTo(-50);
                }];

            }];
        }
        [self.mainTableView setEditing:!self.mainTableView.editing animated:YES];
    }];複製程式碼

5、右下角刪除事件

 [[[self.deleteBtn rac_signalForControlEvents:UIControlEventTouchUpInside] takeUntil:self.rac_willDeallocSignal] subscribeNext:^(id x) {

        @strongify(self);
        NSMutableArray *deleteArray = [NSMutableArray array];
        for (NSIndexPath *indexPath in self.mainTableView.indexPathsForSelectedRows) {
            [deleteArray addObject:self.viewModel.dataArray[indexPath.row]];
        }

        NSMutableArray *currentArray = self.viewModel.dataArray;
        [currentArray removeObjectsInArray:deleteArray];
        self.viewModel.dataArray = currentArray;

        [self.mainTableView deleteRowsAtIndexPaths:self.mainTableView.indexPathsForSelectedRows withRowAnimation:UITableViewRowAnimationLeft];//刪除對應資料的cell

        dispatch_time_t delayTime = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1.0 * NSEC_PER_SEC));
        dispatch_after(delayTime, dispatch_get_main_queue(), ^{

            @strongify(self);
            [self.mainTableView reloadData];
        });

    }];複製程式碼

四、單個刪除(分為系統左滑,和點選cell上刪除按鈕兩種)

1、系統左滑

#pragma mark - delete
- (UITableViewCellEditingStyle)tableView:(UITableView *)tableView editingStyleForRowAtIndexPath:(NSIndexPath *)indexPath {

    return UITableViewCellEditingStyleDelete;
}

- (NSString *)tableView:(UITableView *)tableView titleForDeleteConfirmationButtonForRowAtIndexPath:(NSIndexPath *)indexPath {

    return @"刪除此經驗";
}

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

    [self.viewModel.deleteCommand execute:indexPath];
}複製程式碼

說明:刪除運算元據及UI重新整理和多選是一致的,就不上程式碼了,這裡只需注意左滑需要遵循的系統代理就行。

2、點選Cell刪除

與系統左滑刪除的不同僅僅是手動觸發刪除事件而已。

    [[[self.deleteBtn rac_signalForControlEvents:UIControlEventTouchUpInside] takeUntil:self.rac_prepareForReuseSignal] subscribeNext:^(id x) {

        [viewModel.deleteCommand execute:nil];
    }];複製程式碼

單個刪除的運算元據和UI重新整理也上下程式碼吧(雖然有些重複o(╯□╰)o)

  [[self.viewModel.deleteSubject takeUntil:self.rac_willDeallocSignal] subscribeNext:^(NSIndexPath *indexPath) {

        @strongify(self);

        if (self.viewModel.dataArray.count > indexPath.row) {

            [self.viewModel.dataArray removeObjectAtIndex:indexPath.row];  //刪除陣列裡的資料
            [self.mainTableView deleteRowsAtIndexPaths:[NSMutableArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationLeft];//刪除對應資料的cell

            dispatch_time_t delayTime = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1.0 * NSEC_PER_SEC));
            dispatch_after(delayTime, dispatch_get_main_queue(), ^{

                 @strongify(self);
                 [self.mainTableView reloadData];
            });
        }

    }];複製程式碼

五、tableView的一些Tips(不常用的,或沒注意的)

1、設定tableView可不可以選中(防止cell重複點選也可以利用這條特性)

self.tableView.allowsSelection = NO;複製程式碼

2、允許tableview多選

self.tableView.allowsMultipleSelection = YES;複製程式碼

3、編輯模式下是否可以選中

self.tableView.allowsSelectionDuringEditing = NO;複製程式碼

4、編輯模式下是否可以多選

self.tableView.allowsMultipleSelectionDuringEditing = YES;複製程式碼

5、獲取被選中的所有行

[self.tableView indexPathsForSelectedRows]複製程式碼

6、獲取當前可見的行

[self.tableView indexPathsForVisibleRows];複製程式碼

7、 改變UITableViewCell選中時背景色

cell.selectedBackgroundView.backgroundColor複製程式碼

8、自定義UITableViewCell選中時背景

cell.selectedBackgroundView複製程式碼

9、自定義UITableViewCell選中時系統label字型顏色

cell.textLabel.highlightedTextColor複製程式碼

10、設定tableViewCell間的分割線的顏色

[theTableView setSeparatorColor:[UIColor xxxx ]];複製程式碼

11、pop返回table時,cell自動取消選中狀態(在viewWillAppear中新增如下程式碼)

[self.tableView deselectRowAtIndexPath:[self.tableView indexPathForSelectedRow] animated:YES];複製程式碼

12、點選後,過段時間cell自動取消選中

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

    //消除cell選擇痕跡
    [self performSelector:@selector(deselect) withObject:nil afterDelay:0.5f];
}
- (void)deselect {
    [self.tableview deselectRowAtIndexPath:[self.tableview indexPathForSelectedRow] animated:YES];
}複製程式碼

本文由作者 王隆帥 編寫,轉載請保留版權網址,感謝您的理解與分享,讓生活變的更美好!

相關文章