美文网首页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