在deleteRowsAtIndexPaths后忽略UITableView

我的UITableView有一组单元格。 滑动单元格会导致出现“删除”按钮。 点击此删除按钮会导致执行以下代码:

NSIndexPath *indexPath = [self.tableView indexPathForCell:cell];
[self.tableView deleteRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationLeft];
[self.itemList removeObjectAtIndex:indexPath.row];

这正确地导致从列表中删除单元格。 但是,当我点击UITableVIew中剩下的一个单元格来选择它时,这个抽头被忽略(即没有调用tableView:didSelectRowAtIndexPath)。 如果我再次点击,那么它可以正常工作(即调用tableView:didSelectRowAtIndexPath)。

删除后我点击哪个单元并不重要,删除后多长时间无关紧要,删除后的第一个点击总是被忽略,删除后的第二个点击成功。

基于各种stackoverflow的答案,我试过:

  • 设置self.tableView.editing = NO; 删除后
  • 调用[self.tableView reloadData]; 删除后
  • 调用[self.tableView reloadSections:indexSet withRowAnimation:UITableViewRowAnimationFade]; 删除后
  • 调用[self.tableView beginUpdates]; 在删除和[self.tableView endUpdates]; 删除后
  • 同时进行以上所有操作
  • 以上都没有帮助; 删除后的第一次点击仍然始终被忽略。

    更新:我还添加了[self.itemList removeObjectAtIndex:indexPath.row]; 代码到上面的代码片段。 我的数据源委托方法如下所示:

    -(NSInteger) numberOfSectionsInTableView:(UITableView *)tableView {
        return 1;
    }
    
    -(NSInteger) tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
        return self.itemList.count;
    }
    

    上面的代码片段在doDelete方法中响应按钮点击( [self.deleteButton addTarget:self action:@selector(doDelete) forControlEvents:UIControlEventTouchUpInside];

    更新#2:基于Lyssa的评论,我尝试了以下内容:我删除了对我们的自定义删除按钮和滑动手势的所有引用,然后将此代码添加到我们的UITableView代理中:

    -(BOOL) tableView:(UITableView*)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath {
        return YES;
    }
    
    -(void) tableView:(UITableView*)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath {
        if (editingStyle == UITableViewCellEditingStyleDelete) {
            [self.itemList removeObjectAtIndex:indexPath.row];
            [self.tableView deleteRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationLeft];
        }
    }
    

    这确实有效 - 我现在可以删除行,并且下一个水龙头可以正常工作。 但是,这消除了我们对表格单元格的自定义外观,这是我们自定义代码的目的。 也许我应该看看使用上述方法并自定义删除按钮(我做了一些寻找,但没有找到一个好的答案呢)。


    问题是,当您使用轻扫式删除仅滑动的行进入编辑模式。

    第一个水龙头正在结束该行的编辑模式:

    - (void)tableView:(UITableView *)tableView didEndEditingRowAtIndexPath:(NSIndexPath *)indexPath {
    }
    

    你可以通过设置编辑模式来解决它

    - (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath {
        if (editingStyle == UITableViewCellEditingStyleDelete) {
            [self.itemList removeObjectAtIndex:indexPath.row];
            [self.tableView setEditing:NO animated:YES];
        }
        [self.tableView reloadData];
    }
    

    感谢所有提供对我的问题的解答或评论。 您的意见帮助我追踪了这个问题。

    事实证明,我们正在实现tableView:shouldHighlightRowAtIndexPath并且在删除之后第一次调用返回NO,然后从此返回YES。 这是第一个水龙头被忽略的原因。 我们完全违规的代码是这样的:

    -(BOOL) tableView:(UITableView *)tableView shouldHighlightRowAtIndexPath:(NSIndexPath *)indexPath {
        if (self.currentPath) {
            [self resetSelectedCell];
            self.currentPath = nil;
            return NO;
        }
        return YES;
    }
    

    提供此代码是为了防止一次显示多个删除按钮,但我们在删除后没有正确地重置self.currentPath。 我们现在将self.currentPath设置为零,删除成功并且代码正常工作。

    链接地址: http://www.djcxy.com/p/76067.html

    上一篇: First tap on UITableView ignored after deleteRowsAtIndexPaths

    下一篇: Managing images in bower packages using grunt