• 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];
                    }
                }
            }
        }
    }

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

  • 相关阅读:
    网络编程实验一 win socket基础 获取服务器时间
    ASP.NET Core入门
    vue-element-template 获取后端路由表动态生成权限
    vue-admin-template只有一个子菜单时父级菜单不显示问题
    vue-element-template 本地使用proxy解决跨域问题
    已成功与服务器建立连接,但是在登录过程中发生错误。 (provider: SSL Provider, error: 0
    系统还未初始化,还不能审核期间以后的单据
    金蝶初始化问题
    jqueryMobile 动态添加元素,展示刷新视图方法
    链接数据库 远程事务的处理方式
  • 原文地址:https://www.cnblogs.com/qiyiyifan/p/8310315.html
Copyright © 2020-2023  润新知