zoukankan      html  css  js  c++  java
  • 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];
                    }
                }
            }
        }
    }

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

  • 相关阅读:
    paramiko模块
    JMeter 在beanshell中进行时间戳加减
    订阅号服务开发-05实战总结
    订阅号服务开发-04主动消息推送
    订阅号服务开发02-素材资源管理
    订阅号服务开发03-被动消息应答
    订阅号服务开发01-搭建开发环境
    Docker11-实战-部署多套环境
    Docker10-实战-构建Java Web运行环境
    Docker09-实战-快速搭建wordpress
  • 原文地址:https://www.cnblogs.com/qiyiyifan/p/8310315.html
Copyright © 2011-2022 走看看