Ios 使用KVO删除UITableView中的行时发生冲突

Ios 使用KVO删除UITableView中的行时发生冲突,ios,objective-c,uitableview,Ios,Objective C,Uitableview,我的UITableView中有一个“最近”部分。此处的行数由MIN(10,self.itemCollection.count)确定,因此该部分为10,或集合中的项目总数 我在KVO方法中使用以下代码observeValueForKeyPath: NSKeyValueChange kindOfChange = [change[NSKeyValueChangeKindKey] unsignedIntegerValue]; if (kindOfChange == NSKeyValueChangeRem

我的
UITableView
中有一个“最近”部分。此处的行数由
MIN(10,self.itemCollection.count)
确定,因此该部分为10,或集合中的项目总数

我在KVO方法中使用以下代码
observeValueForKeyPath

NSKeyValueChange kindOfChange = [change[NSKeyValueChangeKindKey] unsignedIntegerValue];
if (kindOfChange == NSKeyValueChangeRemoval) {
    NSIndexSet *indexSetOfChanges = change[NSKeyValueChangeIndexesKey];
    NSMutableArray *indexPathsThatChanged = [NSMutableArray new];
    [indexSetOfChanges enumerateIndexesUsingBlock:^(NSUInteger idx, BOOL *stop) {
        NSIndexPath *newIndexPath = [NSIndexPath indexPathForItem:idx inSection:1];
        [indexPathsThatChanged addObject:newIndexPath];
    }];

    [self.tableView beginUpdates];
    [self.tableView deleteRowsAtIndexPaths:indexPathsThatChanged withRowAnimation:UITableViewRowAnimationAutomatic];
    [self.tableView endUpdates];
}
我得到错误
无效更新:第1节中的行数无效。更新(10)后现有节中包含的行数必须等于更新(10)前该节中包含的行数,加上或减去从该节中插入或删除的行数(0插入,1删除),加上或减去移入或移出该节的行数(0移入,0移出)

我也尝试过在最后一行插入
nsindepath
(因为我正在删除一行),但出现错误
尝试将第10行插入第1节,但更新后第1节中只有10行


委托方法不是紧接着调用的吗?它们是用户集合中的前10项。

该错误表示您正在表上执行的操作(
deleteRowsAtIndexPaths:withRowAnimation:
)与
tableView:numberOfRowsInSection:
方法实现返回的值不一致。最终,该消息告诉您“上次我为第1节调用了
tableView:numberofrowsinssection:
,它说有10个项目。现在你说你删除了1个项目,但
tableView:numberofrowssection:
仍然返回10个。”

要解决此问题,必须使
tableView:numberofrowsinssection:
的行为方式与您对方法的调用一致,这些方法告诉表视图您已更改了对象的数量

原始答案

该行:

[self.tableView deleteRowsAtIndexPaths:@[indexPathsThatChanged] withRowAnimation:UITableViewRowAnimationAutomatic];
正在将您的
indexpathThatChanged
数组包装到另一个数组中。这可能不是您想要的,因为该方法需要的是
nsindepath
实例数组,而不是
nsindepath
实例数组。您应该将其更改为:

[self.tableView deleteRowsAtIndexPaths:indexPathsThatChanged withRowAnimation:UITableViewRowAnimationAutomatic];

抱歉,我在问题中修复了…在我的疑难解答结束时弹出的,这不是我的原始问题。谢谢。在我的情况下,我希望用户看到该行正在“删除”,但大多数情况下,最近部分将始终为10(现在假设为10)。因此,我删除一行,然后在“第10行”插入索引路径"所以整个表都在移动。这应该仍然相当于10行…与
numberofrowsinssection
返回的内容一致。我甚至尝试过删除第3行,循环第4-10行以向上移动,然后在10处添加一行。仍然存在断言错误。我不确定numberOfRows中还需要做什么…我总是希望它是10行。不知道在哪里在代码中插入行。您必须在调用
tableView
上的
beginUpdates
endUpdates
之间插入行,以便保持一致。一旦调用
endUpdates
表视图将调用委托方法来确定行数。如果添加行,则在这里,这将导致您的问题中的第二个错误。在我的问题中,我提到我也尝试插入一行,事实上它介于
beginUpdates
endUpdates
之间。我建议您在插入或删除行的所有行上放置断点,并在
表视图:numberofrowsinssection:
中设置断点,这样您就无法执行此操作了找出不一致的地方。这就是你提到的错误所表明的。鉴于你没有发布完整的代码,很难给你更具体的建议。