代码之家  ›  专栏  ›  技术社区  ›  Martin Cote

具有最大行数的UITableView节

  •  0
  • Martin Cote  · 技术社区  · 15 年前

    我正在实现一个UITableView,其中给定节的行数限制为4。为此,如果行数小于4,我会添加一行作为下一个要添加的项目的占位符(这类似于“联系人”应用程序)。

    当达到该节的最大行数时,我遇到了一个问题。如果我试图从该部分中删除一个对象,我会得到以下异常:

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

    当然,问题是 numberOfRowsInSection 如果行数小于4(占位符的一个额外单元格),则方法返回n+1,这将触发此不一致异常。

    这附近还有吗?

    2 回复  |  直到 15 年前
        1
  •  2
  •   paulthenerd    15 年前

    我遇到了一个类似的问题,因为我提供了一个占位符行,作为在一个应用程序中让用户开始表交互的指南。发生这种情况的原因是该节中的行数必须匹配——正如异常所说。

    处理它的方法很简单,只需在 改变 节中的行数。

    所以在您的例子中,您是说我有四行内容(大概存储在数组或其他数据结构中)。我正在删除其中一行,但我将在其中放置一个占位符行。因此,出于显示目的,节中的行数实际上没有改变。

    然后,您要做的是从数据结构中删除该项,这样当调用cellForRowaTindex时,它将正确加载占位符单元格,但实际上不需要尝试从TableView中删除该行。

    或者,如果您想获得突出显示的交互,我可以尝试通过在一个事务中删除和添加行来验证Ian的建议——不过在这种情况下,我还没有测试过这一点。

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

        2
  •  2
  •   Ian Henry    15 年前

    我认为这是意料之中的。当你告诉它删除一行的时候,它会按照字面意思——它希望该行消失。听起来你只是想把这一排清一下,如果是这样的话,我会打电话给你的 reloadRowsAtIndexPaths: 相反,确保数据源知道此行现在应该为空。

    或者-这可能更好-你可以打电话给 insertRowsAtIndexPath: 就在删除之后。这可能会让你的动画效果更好一点。只需确保用 [tableView beginUpdates] [tableView endUpdates] 声明。

    编辑:重新阅读问题。我不知道我的第一个答案,但我认为我的第二个答案仍然有效。