博客> iOS 小知识点 UITableViewCell 删除的注意事项
iOS 小知识点 UITableViewCell 删除的注意事项
2019-03-22 19:50 评论:0 阅读:177 ZKReadStone
ios

背景:

UITableView的使用 cell上有删除按钮,通过cell上的按钮回调实现删除cell和删除数据源

问题:

除了第一次删除,或者当前cell的indexpath和相对于tableView的indexpath是一致的情况,删除没有问题。 其他的删除就会出现下面的问题:删除错位,会删除cell上显示的indexPath对应于列表的cell。 例如:cell(0,4)删除,就会删除列表上第五个cell

原因:

cell的删除回调会在删除时捕获当前cell的indexpath,导致出现删除错位,其实删除的是block捕获的indexpath tableView就会删除相对于列表的indexPath,而不是当前操作的cell

 Pasted Graphic 2.png  Pasted Graphic 3.png

错误代码展示

-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    ATableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:NSStringFromClass([ATableViewCell class]) forIndexPath:indexPath];
    __weak typeof(self) weakSelf = self;
    cell.deleteBlock = ^(UIButton * _Nonnull btn) {
        [weakSelf.datas removeObject:self.datas[indexPath.row]];
        [weakSelf.tableView deleteRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationRight];
    };
    cell.textLabel.text = [NSString stringWithFormat:@"(0,%@)",self.datas[indexPath.row]];

    return cell;
}

正确代码展示

-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    ATableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:NSStringFromClass([ATableViewCell class]) forIndexPath:indexPath];
    __weak typeof(self) weakSelf = self;
    cell.deleteBlock = ^(UIButton * _Nonnull btn) {
        CGPoint point = [btn convertPoint:btn.bounds.origin toView:tableView];
        NSIndexPath *newIndexPath = [tableView indexPathForRowAtPoint:point];
        [weakSelf.datas removeObject:self.datas[newIndexPath.row]];
        [weakSelf.tableView deleteRowsAtIndexPaths:@[newIndexPath] withRowAnimation:UITableViewRowAnimationRight];
    };
    cell.textLabel.text = [NSString stringWithFormat:@"(0,%@)",self.datas[indexPath.row]];

    return cell;
}
收藏
0
sina weixin mail 回到顶部