我正在实现一个UITableView,其中给定部分的行数限制为4.就此而言,如果行数小于4,我添加一行用作下一个占位符。要添加的项目(这类似于“联系人”应用)。
当我达到该部分的最大行数时,我遇到了问题。如果我尝试从该部分删除一个对象,我会得到以下异常:
由于未捕获的异常'NSInternalInconsistencyException'而终止应用程序,原因:'无效更新:第1节中的行数无效。更新后的现有部分中包含的行数(4)必须等于更新前该部分中包含的行数(4),加上或减去从该部分插入或删除的行数(插入0,删除1)。'
当然,问题是如果行数小于4(占位符的一个额外单元格),我的numberOfRowsInSection
方法返回N + 1,这会触发此不一致异常。
到底有没有?
答案 0 :(得分:2)
我认为这是预期的。当你告诉它删除一行时,它需要字面意思 - 它希望该行消失。听起来你只想清除行,在这种情况下我会调用reloadRowsAtIndexPaths:
,确保你的dataSource知道这一行现在应该是空的。
或者 - 这可能会更好 - 您可以在删除后立即调用insertRowsAtIndexPath:
。这可能会让你的动画更好一些。只需确保用[tableView beginUpdates]
和[tableView endUpdates]
语句附上删除和插入语句。
编辑:重新阅读问题。没关系我的第一个答案,但我认为我的第二个答案仍应有效。
答案 1 :(得分:2)
我遇到了类似的问题,因为我提供了一个占位符行作为指导用户在一个应用程序中启动表交互。它发生的原因是该部分中的行数必须匹配 - 正如例外所述。
处理它的方法很简单,只有在更改部分中的行数时才调用deleteRowsAtIndexPaths。
所以在你的情况下,你说我有四行所有内容(可能存储在数组或其他数据结构中)。我正在删除其中一行,但我将在其中放置一个占位符行。因此,用于显示目的的部分中的行数实际上没有变化。
您要做的是从数据结构中删除该项,以便在调用cellForRowAtIndex时,它将正确加载占位符单元格,但实际上您不需要尝试从tableview中删除该行。
或者,如果你想获得突出显示的交互,我会尝试通过在一个事务中删除和添加行来建议Ian建议 - 但我没有在这种情况下测试过。
我发现用户体验非常流畅,没有额外的动画,但这取决于您的应用。