UITableView deleteRowsAtIndexPaths不起作用

时间:2013-12-27 00:03:31

标签: ios cocoa-touch ios7

我不太确定这里发生了什么,但我正在遇到一份我正在处理的联系表格。在我的表单中,我添加了向联系人添加电子邮件地址的功能。如下图所示,一旦用户点击“添加电子邮件”,就会在“电子邮件”部分添加一行。

Create contact image

然而,在我点击删除电子邮件后,添加电子邮件按钮下方会出现一个额外的单元格(如下图所示)。

before and after

从前面的删除单元格中看到一个小红框,好像表格没有重新加载一样。这是我的删除代码:

- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath
{
    if( editingStyle == UITableViewCellEditingStyleDelete )
    {
        // Update the data source
        NSMutableArray *fields = (NSMutableArray *)self.fields[@(indexPath.section)];
        [fields removeObjectAtIndex:indexPath.row];
        NSMutableArray *values = (NSMutableArray *)self.values[@([self fieldTypeAtIndexPath:indexPath])];
        [values removeObjectAtIndex:indexPath.row];

        [tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationMiddle];
    }
}

那么为什么那个细胞会继续存在?我可以在上面的方法中调用[tableView reloadData],它会删除多余的单元格但是它会混淆动画。你能否澄清一下我在这里做错了什么?

3 个答案:

答案 0 :(得分:1)

这看起来像个错误。

我只是注意到即使Apple在他们的Reminders应用程序中也有同样的错误。这似乎与从具有可变高度项的UITableView中删除行有关。

在Apple的Reminders应用程序中,当您从具有可变高度项目的长列表中删除某些内容时,您将看到相同的精确视觉工件。然后表跳转,列表看起来正确。我假设Apple只是在删除项目后重新加载整个表格视图,以便修复视觉故障。

我的建议是将此报告为Apple的错误。现在你可以像Apple一样重新加载整个表视图。

答案 1 :(得分:0)

选项1:在调用deleteRowsAtIndexPaths之前,必须确保numberOfRowsInSection将返回正确的值(例如,如果您在该部分中最初有2行,则现在应返回1行)。

选项2:如果这不是问题,我会尝试不同的动画类型(例如UITableViewRowAnimationAutomatic),看看是否有任何影响。

选项3:确保cellForRowAtIndexPath返回一个有效的单元格,其内容被重置。否则,它可能会重复使用无效的单元格或显示以前存在的内容。

选项4:由于高度不同,请确保heightForRowAtIndexPath返回正确的值。 You probably need to call reloadRowsAtIndexPaths以便表格视图了解高度差异。

答案 2 :(得分:0)

我有同样的问题,我想这可能是iOS7中的一个错误,它不能正确地重新绘制单元格,我修复它但不是有效的方式,只是在“cellForRowAtIndexPath”中,总是创建一个新的单元格,不要将它出列。