我有一个 UITableView
,用户可以在其中插入新行。发生这种情况时,我想重新加载表中的所有旧行。一种解决方案是在插入发生后立即调用 reloadData
,这完全有效,但这意味着我没有获得插入动画。
因此,当用户点击“添加行”按钮时,我会使用除刚刚插入的索引路径之外的每个索引路径调用 reloadRowsAtIndexPaths:
。然后我只使用新插入的行调用 insertRowsAtIndexPaths:
。合理吧?
这会导致应用程序崩溃,解释如下:
这种情况会发生,正如您在本示例中所见,即使向 reloadRowsAtIndexPaths
传递了索引路径的空数组。
啊!我需要用 beginUpdates
和 endUpdates
包装这两个调用。很公平。但是现在动画完全坏了。
我正在使用 UITableViewRowAnimationFade
执行重新加载,并使用 UITableViewRowAnimationAutomatic
执行插入。但是在动画过程中,每一行的高度都会发生变化,从而产生这种看起来很可怕的奇怪闪烁效果。为这些更改设置动画的正确方法是什么?
编辑:
来自 reloadRowsAtIndexPaths:withRowAnimation:
的文档:
我认为,在我的应用程序中,手动更新每个单元格是正确的方法。但是,我仍然对这个奇怪的动画错误感到不安,并且想知道它的原因是什么/如果我确实“想提醒用户单元格的值正在改变”,我会怎么做。
最佳答案
获得该错误的一个常见原因是,正如文档所说,数据源被要求提供一个单元格。可能不太清楚它被要求两次......一次提供初始数据,再次提供最终数据。这意味着 tableView:numberOfRowsInSection: 方法必须返回 beginUpdates 之前的旧值和 endUpdates 之后的新值(或者如果您使用快捷方法,则在调用之前和之后)。如果相关,也不要忘记 numberOfSectionsInTableView。
例子:
numberOfRows... return [array count];
// Incorrect
[array addObject:object];
[tableView beginUpdates];
[tableView insertRow..];
[tableView endUpdates];
// Correct
[tableView beginUpdates];
[array addObject:object];
[tableView insertRow..];
[tableView endUpdates];
对于您的具体情况,我建议先插入,然后在整个 tableview 上调用 reloadData,只要这不会弄乱您的动画或其他任何东西。
关于ios - UITableView 的 reloadRowsAtIndexPaths : seems to break insertRowsAtIndexPaths:,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/9962275/