2009-12-11 57 views
0

我正在实现UITableView,其中给定部分的行数限制为4.对于这一点,如果行数小于4,则添加一行即用作要添加的下一个项目的占位符(这与“联系人”应用程序类似)。具有最大行数的UITableView部分

当我达到该节的最大行数时出现问题。如果我尝试从部分删除对象,我得到以下异常:

终止应用程序由于未捕获的异常“NSInternalInconsistencyException”,理由是:“无效的更新:行数量无效第1号在更新(4)之后,包含在现有节中的行必须等于更新前(4)中包含在该节中的行数,加上或减去从该节插入或删除的行数(0插入,1删除)。”

当然,问题是,我的方法numberOfRowsInSection返回N + 1,如果行数是,其触发这种不一致例外小于4(对于占位一个额外的小区)。

反正有这个吗?

回答

2

我遇到了类似的问题,因为我提供了一个占位符行以充当指导,让用户在一个应用程序中启动表格交互。发生这种情况的原因是该部分中的行数必须匹配 - 正如例外情况所述。

处理该问题的方法很简单,只需调用deleteRowsAtIndexPaths,在更改节中的行数时。

所以在你的情况下,你说我有四行所有的内容(大概存储在一个数组或其他数据结构)。我正在删除这些行中的一行,但我将在其中放置一个占位符行。所以用于显示的部分中的行数实际上不会改变。

你想要做的是从数据结构中删除项目,这样当cellForRowAtIndex被调用时它会正确加载占位符单元格,但实际上并不需要尝试从tableview中删除该行。

或者,如果你想获得突出显示的交互,我会尝试通过在一个事务中删除和添加行来提示Ian的建议 - 尽管如此,我还没有测试过。

我发现用户体验非常流畅,没有额外的动画,但取决于您的应用程序。

2

我认为这是预期的。当你告诉它删除一行时,它会从字面上看 - 它希望那行不见了。这听起来像你只是想清除行,在这种情况下,我会打电话给reloadRowsAtIndexPaths:,确保你的dataSource知道这行现在应该是空的。

或者 - 这可能会更好 - 您可以在删除后立即调用insertRowsAtIndexPath:。这可能会让你更好地制作动画。只要确保您附带删除和插入语句[tableView beginUpdates][tableView endUpdates]语句。

编辑:刚刚重读的问题。没有想到我的第一个答案,但我认为我的第二个答案应该仍然有效。