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

一恭取、前言

這次分享并記錄一下tableView的多選刪除习瑰,并額外記錄一下單選刪除及tableView的設(shè)置小技巧。

二秽荤、想要實現(xiàn)的效果圖如下:

1、先上原圖

2柠横、然后編輯圖如下

3窃款、編輯步驟:

  • 點擊右上角按鈕編輯,界面呈現(xiàn)編輯狀態(tài)底部刪除按鈕彈出
  • 選擇刪除cell項牍氛,點擊右下角刪除可刪除
  • 點擊右上角晨继,退出編輯狀態(tài),底部刪除按鈕退出界面

三搬俊、多選刪除核心代碼

1紊扬、設(shè)置允許tableView編輯狀態(tài)下允許多選

_mainTableView.allowsMultipleSelectionDuringEditing = YES;

2蜒茄、將cell設(shè)置為可選擇的風(fēng)格(下面代碼是在自定義Cell內(nèi)部)

self.selectionStyle = UITableViewCellSelectionStyleDefault;

說明:因為自認(rèn)為系統(tǒng)的選中狀態(tài)很難看,所以在cell的基類里已經(jīng)把 selectionStyle 設(shè)置為None餐屎,但是想要多選必須將其打開檀葛,大家切記。

3腹缩、不喜歡系統(tǒng)的選中狀態(tài)屿聋,可更改選中狀態(tài)的背景(下面也是在自定義cell內(nèi)部)

 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];//刪除對應(yīng)數(shù)據(jù)的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];
        });

    }];

四润讥、單個刪除(分為系統(tǒng)左滑,和點擊cell上刪除按鈕兩種)

1盘寡、系統(tǒng)左滑

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

- (NSString *)tableView:(UITableView *)tableView titleForDeleteConfirmationButtonForRowAtIndexPath:(NSIndexPath *)indexPath {
    
    return @"刪除此經(jīng)驗";
}

- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath {
    
    [self.viewModel.deleteCommand execute:indexPath];
}

說明:刪除操作數(shù)據(jù)及UI刷新和多選是一致的楚殿,就不上代碼了,這里只需注意左滑需要遵循的系統(tǒng)代理就行竿痰。

2脆粥、點擊Cell刪除

與系統(tǒng)左滑刪除的不同僅僅是手動觸發(fā)刪除事件而已。

    [[[self.deleteBtn rac_signalForControlEvents:UIControlEventTouchUpInside] takeUntil:self.rac_prepareForReuseSignal] subscribeNext:^(id x) {
       
        [viewModel.deleteCommand execute:nil];
    }];

單個刪除的操作數(shù)據(jù)和UI刷新也上下代碼吧!(雖然有些重復(fù)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];  //刪除數(shù)組里的數(shù)據(jù)
            [self.mainTableView deleteRowsAtIndexPaths:[NSMutableArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationLeft];//刪除對應(yīng)數(shù)據(jù)的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、設(shè)置tableView可不可以選中(防止cell重復(fù)點擊也可以利用這條特性)

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孵户、獲取當(dāng)前可見的行

[self.tableView indexPathsForVisibleRows];

7、 改變UITableViewCell選中時背景色

cell.selectedBackgroundView.backgroundColor

8岔留、自定義UITableViewCell選中時背景

cell.selectedBackgroundView

9夏哭、自定義UITableViewCell選中時系統(tǒng)label字體顏色

cell.textLabel.highlightedTextColor

10、設(shè)置tableViewCell間的分割線的顏色

[theTableView setSeparatorColor:[UIColor xxxx ]];

11献联、pop返回table時竖配,cell自動取消選中狀態(tài)(在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];
}

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末进胯,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子原押,更是在濱河造成了極大的恐慌胁镐,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,589評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異盯漂,居然都是意外死亡颇玷,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,615評論 3 396
  • 文/潘曉璐 我一進(jìn)店門就缆,熙熙樓的掌柜王于貴愁眉苦臉地迎上來帖渠,“玉大人,你說我怎么就攤上這事违崇“⑵” “怎么了?”我有些...
    開封第一講書人閱讀 165,933評論 0 356
  • 文/不壞的土叔 我叫張陵羞延,是天一觀的道長渣淳。 經(jīng)常有香客問我,道長伴箩,這世上最難降的妖魔是什么入愧? 我笑而不...
    開封第一講書人閱讀 58,976評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮嗤谚,結(jié)果婚禮上棺蛛,老公的妹妹穿的比我還像新娘。我一直安慰自己巩步,他們只是感情好旁赊,可當(dāng)我...
    茶點故事閱讀 67,999評論 6 393
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著椅野,像睡著了一般终畅。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上竟闪,一...
    開封第一講書人閱讀 51,775評論 1 307
  • 那天离福,我揣著相機(jī)與錄音,去河邊找鬼炼蛤。 笑死妖爷,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的理朋。 我是一名探鬼主播絮识,決...
    沈念sama閱讀 40,474評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼嗽上!你這毒婦竟也來了笋除?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,359評論 0 276
  • 序言:老撾萬榮一對情侶失蹤炸裆,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后鲜屏,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體烹看,經(jīng)...
    沈念sama閱讀 45,854評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡国拇,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,007評論 3 338
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了惯殊。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片酱吝。...
    茶點故事閱讀 40,146評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖土思,靈堂內(nèi)的尸體忽然破棺而出务热,到底是詐尸還是另有隱情,我是刑警寧澤己儒,帶...
    沈念sama閱讀 35,826評論 5 346
  • 正文 年R本政府宣布崎岂,位于F島的核電站,受9級特大地震影響闪湾,放射性物質(zhì)發(fā)生泄漏冲甘。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,484評論 3 331
  • 文/蒙蒙 一途样、第九天 我趴在偏房一處隱蔽的房頂上張望江醇。 院中可真熱鬧,春花似錦何暇、人聲如沸陶夜。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,029評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽条辟。三九已至,卻和暖如春遏插,著一層夾襖步出監(jiān)牢的瞬間捂贿,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,153評論 1 272
  • 我被黑心中介騙來泰國打工胳嘲, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留厂僧,地道東北人。 一個月前我還...
    沈念sama閱讀 48,420評論 3 373
  • 正文 我出身青樓了牛,卻偏偏與公主長得像颜屠,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子鹰祸,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,107評論 2 356

推薦閱讀更多精彩內(nèi)容