在deleteRowsAtIndexPaths之后首先点击UITableView

时间:2013-12-10 14:41:31

标签: ios objective-c 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];
    }
}

这确实有效 - 我现在可以删除行,下一个点击可以正常工作。但是,这会删除我们的表格单元格的自定义外观,这首先是我们自定义代码的目的。也许我应该考虑使用上面的方法并自定义删除按钮(我已经做了一些寻找,但还没有找到一个好的答案)。

2 个答案:

答案 0 :(得分:4)

问题是,当您使用滑动删除时,只有您滑动的行会进入编辑模式。

第一次点击即结束该行的编辑模式:

- (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];
}

答案 1 :(得分:0)

感谢所有为我的问题提供答案或评论的人。您的评论帮助我找到了问题。

事实证明我们正在实施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设置为nil并且代码正常工作。