insertRowsAtIndexPaths为每一行调用cellForRowAtIndexPath

smp*_*kes 3 iphone uitableview ios

我正在尝试使用insertRowsAtIndexPaths在一个步骤中将一堆行插入到空的UITableView中.(我知道这听起来并不那么有用,但它是我真正需要做的简化版本.)

我看到的问题是,在我调用insertRowsAtIndexPaths之后,我为每个插入的行调用了cellForRowAtIndexPath,而不仅仅是那些可见的行.

这似乎不对.如果这样做,对我来说几乎没用.

我看到的唯一有点奇怪的其他工件是,当我这样做时,它实际上似乎将行动画到位.这不是withRowAnimation,因为它设置为none.但似乎这里有某种更高级别的动画概念.我有一个想法,因为它将行动画到位,它认为它需要更多/所有行的单元格,直到它们被推离屏幕.但是,如果不使用我希望避免使用的reloadData,我无法关闭此动画.

通常我有一个在幕后改变的数据集.我可以仔细检查并构造更改以生成插入/删除/重新加载调用的数据.但我无法将其限制在屏幕上的内容,因为它与数据提供者不匹配.

我想我必须遗漏一些东西......任何想法?

(我在beginUpdates/endUpdates对中执行此操作,但这似乎没有区别.)

smp*_*kes 5

我今天和一些苹果人谈过.该问题肯定与UITableView在插入新行时所执行的动画有关.这是为单元格创建新行的动画,与通过insertRowsAtIndexPaths引入这些行时使用的动画分开.

由于表级动画通过一种"长大"类型的东西创建新行,因此在插入动画期间,少量的单元格被认为是可见的,并且表格将为它们调用cellForRowAtIndexPath.

对于所有情况,似乎没有任何替代实现.对我的案例推荐的解决方案是"撒谎":弄清楚动画后页面上将存在哪些单元格并插入它们.在该动画完成后,插入将不显示的其余单元格,表格将不会调用cellForRowAtIndexPath.

这需要在表视图和"真实"数据源之间实现一个对象,该对象在动画持续时间内可以"躺在"表视图中关于表中的行数.痛苦,但这显然是在类似情况下所做的.

  • 不.这不是细胞动画.这是表级动画(用Apple确认),即使你使用UITableViewRowAnimationNone也会出现这种情况:表格仍然会动画细胞,至少在表格中没有行开始的情况下,只有空占位符.禁用此功能的唯一方法是在UIView级别关闭动画,但之后你几乎要回到reloadData. (2认同)