'无效的更新:第0部分中的无效行数


70

我已经阅读了所有与此相关的文章,但仍然出现错误:

'Invalid update: invalid number of rows in section 0.  The number of rows contained in an existing section after the update (5) must be equal to the number of rows contained in that section before the update (5), plus or minus the number of rows inserted or deleted from that section (0 inserted, 1 deleted) and plus or minus the number of rows moved into or out of that section (0 moved in, 0 moved out).'

详细信息如下:

.h我有一个NSMutableArray

@property (strong,nonatomic) NSMutableArray *currentCart;

.mnumberOfRowsInSection看来是这样的:

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    // Return the number of rows in the section.


    return ([currentCart count]);

}

要启用删除和从阵列中删除对象:

// Editing of rows is enabled
- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath {
    if (editingStyle == UITableViewCellEditingStyleDelete) {

        //when delete is tapped
        [tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade];

        [currentCart removeObjectAtIndex:indexPath.row];


    }
}

我以为,通过让我的节数依赖于我正在编辑的数组的数量,可以确保适当的行数?在删除行时是否不必重新加载表就可以做到吗?

Answers:


157

您需要调用之前从数据数组中删除该对象deleteRowsAtIndexPaths:withRowAnimation:。因此,您的代码应如下所示:

// Editing of rows is enabled
- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath {
    if (editingStyle == UITableViewCellEditingStyleDelete) {

        //when delete is tapped
        [currentCart removeObjectAtIndex:indexPath.row];

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

您还可以使用数组创建快捷方式来稍微简化代码@[]

[tableView deleteRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationFade];

令人难以置信的是我忽略了有缺陷的逻辑。简单的解决方案,我发疯了,想弄清楚我的计数是否被错误地传递了。非常感谢你。
user3085646 2014年

没问题!我之前无数次做过完全相同的事情,所以这就是为什么我对问题有一个很好的了解的原因。
撤消

1
如果我要返回行号并按字面值怎么办。就像开关(部分)一样{情况0:返回3;打破; 情况1:返回5;打破; 情况2:返回2;打破; }返回0; 我没有设置模型阵列。我只是在学习表格视图。我发现了问题,尝试创建modelarray并删除removeObjectAtIndex,但仍然遇到相同的错误。
Alix

为什么数组与数据源如此互锁?会deleteRowsAtIndexPaths自动调用reloadData吗?然后看到不匹配?
亲爱的

14

Swift版本->在调用之前从数据数组中删除对象

func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCellEditingStyle, forRowAt indexPath: IndexPath) {
    if editingStyle == .delete {
        print("Deleted")

        currentCart.remove(at: indexPath.row) //Remove element from your array 
        self.tableView.deleteRows(at: [indexPath], with: .automatic)
    }
}

4

就我而言,问题是numberOfRowsInSection在调用后返回了相似的行数tableView.deleteRows(...)

由于在我的情况下这是必需的行为,因此我结束了调用,tableView.reloadData()而不是在删除行后仍保持不变的tableView.deleteRows(...)情况下调用numberOfRowsInSection


0

这是上面添加了一些实际操作代码的代码(第1点和第2点);

func tableView(_ tableView: UITableView, trailingSwipeActionsConfigurationForRowAt indexPath: IndexPath) -> UISwipeActionsConfiguration? {
    let deleteAction = UIContextualAction(style: .destructive, title: "Delete") { _, _, completionHandler in

        // 1. remove object from your array
        scannedItems.remove(at: indexPath.row)
        // 2. reload the table, otherwise you get an index out of bounds crash
        self.tableView.reloadData()

        completionHandler(true)
    }
    deleteAction.backgroundColor = .systemOrange
    let configuration = UISwipeActionsConfiguration(actions: [deleteAction])
    configuration.performsFirstActionWithFullSwipe = true
    return configuration
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.