TableView左滑删除功能实现及不经意间遇到的坑
2016-12-14 本文已影响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];
}
- 效果图
在我继续完善删除功能的时候问题就来了
- 首先是
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];