iOS tableview添加左划删除事件并且自定义删除按钮的样式

1.最普通的那种情况,左划两个按钮:修改和删除

- (BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath
{
    return YES;
}

- (NSArray<UITableViewRowAction *> *)tableView:(UITableView *)tableView editActionsForRowAtIndexPath:(NSIndexPath *)indexPath
{
    FNAgendaLabelModel *labelModel = [[self.entities objectAtIndex:indexPath.section] objectAtIndex:indexPath.row];

    UITableViewRowAction *modifiAction = [UITableViewRowAction rowActionWithStyle:UITableViewRowActionStyleNormal title:@"修改" handler:^(UITableViewRowAction *action, NSIndexPath *indexPath) {
        tableView.editing = NO;

        if (self.labelDelegate && [self.labelDelegate respondsToSelector:@selector(agendaLabelDidModify:)]) {
            [self.labelDelegate agendaLabelDidModify:labelModel];
        }

    }];
    modifiAction.backgroundColor = [UIColor darkGrayColor];


    UITableViewRowAction *deleteAction = [UITableViewRowAction rowActionWithStyle:UITableViewRowActionStyleDefault title:@"删除" handler:^(UITableViewRowAction *action, NSIndexPath *indexPath) {
        tableView.editing = NO;

        if (self.labelDelegate && [self.labelDelegate respondsToSelector:@selector(agendaLabelDidDelete:)]) {
            [self.labelDelegate agendaLabelDidDelete:labelModel];
        }

    }];
    return @[deleteAction, modifiAction];
}

注意:这边有个坑,我发现在iOS8.2系统上滑动事件是不响应的

解决方法:实现这个方法就好了,里面什么都不用写

//左划在iOS8.2不响应解决办法
/**
 *提交编辑状态
 */
- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath {
}

2.产品提了一个需求,左划显示两个按钮图片,网上百度了好久很少有这块的资料,不过最后还是倒腾出来了

先贴图吧:

上代码:

在你的tableview代理方法里面:

//左划在iOS8.2不响应解决办法
/**
 *提交编辑状态
 */
- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath {
}

- (BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath {
    return YES;
}

- (NSArray<UITableViewRowAction *> *)tableView:(UITableView *)tableView editActionsForRowAtIndexPath:(NSIndexPath *)indexPath{
    
    NSInteger row = [indexPath row];
    if (row < 0 || row >= self.entities.count) {
        return nil;
    }
    
    FNAgendaModel *agenModel = [self.entities objectAtIndex:indexPath.row];
    //刷新cell布局,解决有时候图片无法显示出来的问题
    UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath];
    [cell setNeedsLayout];
    
    __weak typeof(self) weakSelf = self;
    UITableViewRowAction *classAction = [UITableViewRowAction rowActionWithStyle:UITableViewRowActionStyleNormal title:@"修改" handler:^(UITableViewRowAction *action, NSIndexPath *indexPath) {
        tableView.editing = NO;
        //代理
        if (weakSelf.delegate && [weakSelf.delegate respondsToSelector:@selector(agendaDidModify:)]) {
            [weakSelf.delegate agendaDidModify:agenModel];
        }
    }];
//    classAction
    classAction.backgroundColor = UIColorFromRGB(0xF5F5F5);
    
    
    UITableViewRowAction *delegateAction = [UITableViewRowAction rowActionWithStyle:UITableViewRowActionStyleDefault title:@"删除" handler:^(UITableViewRowAction *action, NSIndexPath *indexPath) {
        tableView.editing = NO;
        //代理
        if (weakSelf.delegate && [weakSelf.delegate respondsToSelector:@selector(agendaDidDelete:)]) {
            [weakSelf.delegate agendaDidDelete:agenModel];
        }
    }];
    delegateAction.backgroundColor = UIColorFromRGB(0xF5F5F5);
    
     return @[delegateAction, classAction];
}

在你的cell.m文件里面

//左划出现分类与删除图标
- (void)layoutSubviews {
    [super layoutSubviews];
    [self setDealDeleteButtonAndClassButton];
}
- (void)setDealDeleteButtonAndClassButton{
    
    if (IOS11)
    {
        // iOS 11层级 (Xcode 9编译): UITableView -> UISwipeActionPullView
        for (UIView *subview in self.superview.subviews)
        {
            if ([subview isKindOfClass:NSClassFromString(@"UISwipeActionPullView")])
            {
                // 和iOS 10的按钮顺序相反
                if (_entity.status == FNAgendaStatusComplete || _entity.status == FNAgendaStatusClosed) {
                    UIButton *deleteButton = subview.subviews[0];
                    [deleteButton setImage:[UIImage imageNamed:@"ic_list_delete"] forState:(UIControlStateNormal)];
                    [deleteButton setTitle:@"" forState:UIControlStateNormal];
                } else {
                    UIButton *deleteButton = subview.subviews[1];
                    UIButton *classButton = subview.subviews[0];
                    [deleteButton setImage:[UIImage imageNamed:@"ic_list_delete"] forState:(UIControlStateNormal)];
                    [deleteButton setTitle:@"" forState:UIControlStateNormal];
                    [classButton setImage:[UIImage imageNamed:@"ic_list_tag"] forState:(UIControlStateNormal)];
                    [classButton setTitle:@"" forState:UIControlStateNormal];
                }
            }
        }
    } else {
        // iOS 9-10层级
        for (UIView *subview in self.subviews)
        {
            if ([subview isKindOfClass:NSClassFromString(@"UITableViewCellDeleteConfirmationView")])
            {
                if (_entity.status == FNAgendaStatusComplete || _entity.status == FNAgendaStatusClosed) {
                    UIButton *deleteButton = subview.subviews[0];
                    [deleteButton setImage:[UIImage imageNamed:@"ic_list_delete"] forState:(UIControlStateNormal)];
                    [deleteButton setTitle:@"" forState:UIControlStateNormal];
                } else {
                    UIButton *deleteButton = subview.subviews[0];
                    UIButton *classButton = subview.subviews[1];
                    [deleteButton setImage:[UIImage imageNamed:@"ic_list_delete"] forState:(UIControlStateNormal)];
                    [deleteButton setTitle:@"" forState:UIControlStateNormal];
                    [classButton setImage:[UIImage imageNamed:@"ic_list_tag"] forState:(UIControlStateNormal)];
                    [classButton setTitle:@"" forState:UIControlStateNormal];
                }
            }
        }
    }
}

这就好了,这份代码是参考了简书上一位同学的,但是我现在找不到他的博客了,如有违权请联系我

原文地址:https://www.cnblogs.com/qiyiyifan/p/8310315.html