1. 程式人生 > >使用TableView自帶的多選功能

使用TableView自帶的多選功能

一、簡單實現

1.設定tableView屬性

self.tableView.allowsMultipleSelectionDuringEditing = YES; 

2.然後在編輯按鈕顯示tableView編輯狀態

[self.tableView setEditing:YES animated:YES]; 

3.檢視被選中cell的indexPath陣列

NSArray *indexs = self.tableView.indexPathsForSelectedRows;

二、實戰使用

功能要求:

1.點選多選按鈕,進入多選模式

2.滿足條件的才會出現多選項(部分cell多選)

3.多選狀態下,選中和取消都要獲取(實時計算選中cell中某個值的總和,以及選中數量)

實現:

1.簡單方法無法實現部分多選,所以用另一種方法進入編輯模式

不需要設定

self.tableView.allowsMultipleSelectionDuringEditing = YES; 

實現兩個代理方法

- (UITableViewCellEditingStyle)tableView:(UITableView *)tableView editingStyleForRowAtIndexPath:(NSIndexPath *)indexPath{
    if (indexPath.row < 5) {
        return UITableViewCellEditingStyleDelete | UITableViewCellEditingStyleInsert;
    }else{
        return UITableViewCellEditingStyleNone;
    }
}

ps:row<5 的顯示系統自帶的多選圖示,否則不顯示

- (BOOL)tableView:(UITableView *)tableView shouldIndentWhileEditingRowAtIndexPath:(NSIndexPath *)indexPath {
    if (indexPath.row < 5) {
        return YES;
    } else {
        return NO;
    }
}
ps :row<5 的會有cell向右移動,出現多選按鈕的動作,否則沒有動作,不會出現多選按鈕

2.在選中cell的代理方法中,如果在編輯狀態則處理選中事件,否則跳轉其他頁面

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{
    // 編輯狀態返回
    if (tableView.isEditing) {
        NSArray *indexs = tableView.indexPathsForSelectedRows;
        for (NSIndexPath *index in indexs) {
            // 可以取到所有選中cell的index
        }
        return;
    }
   // 正常cell點選動作
}

3、編輯狀態如果取消選擇的話不會進入上面方法,需要單獨處理取消事件

- (void)tableView:(UITableView *)tableView didDeselectRowAtIndexPath:(NSIndexPath *)indexPath{
     NSLog(@"取消 - %ld",indexPath.row);
}

三、其他設定

1、自帶按鈕顏色設定

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
    // ...
     directCell.tintColor = MainTone;
   // ...
}

2.判斷是否在編輯狀態(可用於編輯狀態 是/否 切換),返回BOOL值

tableView.isEditing

3.自定義多選按鈕(cell中實現)

-(void)layoutSubviews
{
    for (UIControl *control in self.subviews){
        if ([control isMemberOfClass:NSClassFromString(@"UITableViewCellEditControl")]){
            for (UIView *v in control.subviews)
            {
                if ([v isKindOfClass: [UIImageView class]]) {
                    UIImageView *img=(UIImageView *)v;
                    if (self.selected) {
                        img.image=[UIImage imageNamed:@"xuanzhong_icon"];
                    }else
                    {
                        img.image=[UIImage imageNamed:@"weixuanzhong_icon"];
                    }
                }
            }
        }
    }
    [super layoutSubviews];
}
//適配第一次圖片為空的情況
- (void)setEditing:(BOOL)editing animated:(BOOL)animated
{
    [super setEditing:editing animated:animated];
    for (UIControl *control in self.subviews){
        if ([control isMemberOfClass:NSClassFromString(@"UITableViewCellEditControl")]){
            for (UIView *v in control.subviews)
            {
                if ([v isKindOfClass: [UIImageView class]]) {
                    UIImageView *img=(UIImageView *)v;
                    if (!self.selected) {
                        img.image=[UIImage imageNamed:@"weixuanzhong_icon"];
                    }
                }
            }
        }
    }
}

4.取消選擇

[tableView deselectRowAtIndexPath:indexPath animated:YES];

四、坑

千萬不要設定

cell.selectionStyle = UITableViewCellSelectionStyleNone;