使用insertRowsAtIndexPaths进行无效的表视图更新:

时间:2012-04-03 05:14:15

标签: iphone uitableview

我在使用insertRowsAtIndexPaths时遇到问题:我不太确定它是如何工作的。我在上面观看了WWDC 2010视频,但我仍然收到错误消息。我以为我应该更新模型,然后在tableView beginUpdates和endUpdates调用中包装insertRowsAtIndexPaths :.我有这个:

self.customTableArray = (NSMutableArray *)sortedArray;
[_customTableView beginUpdates];
[tempUnsortedArray enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
    [sortedArray enumerateObjectsUsingBlock:^(id sortedObj, NSUInteger sortedIdx, BOOL *sortedStop) {
        if ([obj isEqualToString:sortedObj]) {
            NSIndexPath *newRow = [NSIndexPath indexPathForRow:sortedIdx inSection:0];
            [_customTableView insertRowsAtIndexPaths:[NSArray arrayWithObject:newRow] withRowAnimation:UITableViewRowAnimationAutomatic];
            *sortedStop = YES;
        }
    }];
}];
[_customTableView endUpdates];

customTableArray是我的模型数组。 sortedArray只是该数组的排序版本。当我按下加号按钮添加新行时运行此代码时,我收到此错误:

  

由于未捕获的异常而终止应用   'NSInternalInconsistencyException',原因:'无效更新:无效   第0节中的行数。包含在中的行数   更新后的现有部分(2)必须等于数量   在更新(1)之前,该部分中包含的行加或减   从该部分插入或删除的行数(插入2个,   删除0)加上或减去移入或移出的行数   该部分(0移入,0移出)。'

我不确定我做错了什么。思考?感谢。

1 个答案:

答案 0 :(得分:3)

我建议你对阵列中实际发生的事情看一点。当错误读出时,你告诉表视图由于某种原因添加两行,而它说“有一行”,然后在调用-endUpdates方法后检查数据源,并且数组总共只有两个对象,而不是三个。

从本质上讲,您的枚举正在进行两次插入。您的数组有两个对象。该表已经有一个对象。 1个现有+ 2个插入= 3行。您的数组中只有两个当前对象。额外的物体发生了什么。

我希望在某个地方,你的两个数组不同步,或者你评估哪个是插入的方式有某种形式的错误。

我希望有所帮助。