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:
中设置断点,这样您就无法执行此操作了找出不一致的地方。这就是你提到的错误所表明的。鉴于你没有发布完整的代码,很难给你更具体的建议。