美文网首页ios 进阶ios UI与自定义控件开发技巧
TableView左滑删除功能实现及不经意间遇到的坑

TableView左滑删除功能实现及不经意间遇到的坑

作者: 暗尘随码去 | 来源:发表于2016-12-14 17:08 被阅读4513次

    TableView左滑删除功能相信在很多APP中都可以看到,不过在自己写的过程中还是遇到了几处小问题。

    • 问题一:mutating method sent to immutable object(我操作的确实是NSMutableArray 但还是报错了)

    • 问题二:Invalid update: invalid number of rows in section 0

    左滑删除实现过程

    • iOS8之后的协议多了一个方法,返回值是数组的tableView:editActionsForRowAtIndexPath:方法,我们可以在方法内部写好几个按钮,然后放到数组中返回,那些按钮的类就是UITableViewRowAction
    • 在UITableViewRowAction类,我们可以设置按钮的样式、显示的文字、背景色、和按钮的事件
    • 在代理方法中,我们可以创建多个按钮放到数组中返回,最先放入数组的按钮显示在最右侧,最后放入的显示在最左侧
    
    //左拉抽屉(删除和修改按钮)
    - (NSArray *)tableView:(UITableView *)tableView editActionsForRowAtIndexPath:(NSIndexPath *)indexPath
    {
        // 添加一个删除按钮
        UITableViewRowAction *deleteRowAction = [UITableViewRowAction rowActionWithStyle:UITableViewRowActionStyleDestructive title:@"删除用户"handler:^(UITableViewRowAction *action, NSIndexPath *indexPath) {
                    [self.dataArr  removeObjectAtIndex:indexPath.row];
                    [m_tableView deleteRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationFade];
        }];
        
        // 修改资料按钮
        UITableViewRowAction *editRowAction = [UITableViewRowAction rowActionWithStyle:UITableViewRowActionStyleDefault title:@"修改资料"handler:^(UITableViewRowAction *action, NSIndexPath *indexPath) {
            
        }];
        
        editRowAction.backgroundColor = [UIColor blueColor];
        // 将设置好的按钮放到数组中返回
        return @[deleteRowAction, editRowAction];
    }
    
    
    • 效果图
    左滑功能.png

    在我继续完善删除功能的时候问题就来了

    • 首先是 mutating method sent to immutable object这个问题,翻译过来就是把一个可变量对应的方法 让一个不可变量来调用。
    • 但我的数组明明定义的是可变数组
          /** 所有的数据 */
    @property (nonatomic, strong) NSMutableArray *dataArr;
    @end
    
    @implementation ZiLiaoViewController
    
    -(NSMutableArray *)dataArr{
        if (!_dataArr) {
            _dataArr = [NSMutableArray array];
        }
        return _dataArr;
    }
    

    出现的原因是因为在数据请求成功后给dataArr赋值的时候,把一个不可变数组赋值给一个可变数组,所以即使声明了NSMutableArray可变,也没用!

    NSMutableDictionary *dic =json[@"result"];
                self.dataArr = dic[@"data"];
    

    解决办法:在声明一个新的可变数组进行操作

    NSMutableArray * temArray = [NSMutableArray arrayWithArray:self.dataArr];
                    [temArray removeObjectAtIndex:indexPath.row];
    
    • 于是又出现了新的问题Invalid update: invalid number of rows in section 0
      • 原因是我们已经移除了一个元素也就是数组的长度发生了变化而在tableview返回长度的代理方法中长度是没有更新的。
      • 解决办法 在用dataArry来装我们的临时可变数组temArray 那么问题就解决了
      • 即代码是这样的
    NSMutableArray * temArray = [NSMutableArray arrayWithArray:self.dataArr];
    [temArray removeObjectAtIndex:indexPath.row];
    self.dataArr = [NSMutableArray arrayWithArray:temArray];
    [m_tableView deleteRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationFade];
    

    至此左滑删除功能实现

    相关文章

      网友评论

      本文标题:TableView左滑删除功能实现及不经意间遇到的坑

      本文链接:https://www.haomeiwen.com/subject/uqnimttx.html