ios - TableView reloadData 与 beginUpdates & endUpdates

标签 ios objective-c reloaddata

我在更新 TableView 时遇到了一个棘手的问题,我使用不同的更新方法得到了不同的结果,让我解释一下:

情况一: 我使用 [tbl reloadData];,其中 tbl 是我的 TableView,以更新 TableView - 按预期工作。

情况 2: 我使用:

[tbl beginUpdates];
[tbl reloadRowsAtIndexPaths:indexPaths withRowAnimation:UITableViewRowAnimationRight];
[tbl endUpdates];

tbl 是我的 TableView,indexPaths 是一个包含 TableView 中所有索引路径的数组。现在数组很好,它包含所有正确的索引路径(双重和三次检查)但出于某种原因 - 这没有按预期工作。

现在我意识到这是一个 X-Y 问题(我要求 Y,但我的问题实际上是 X,因为我认为解决 Y 会解决 X),那只是因为我觉得解释 X 有点复杂(说的结果上面的问题)以一种简单的方式,所以如果可能的话我宁愿避免这样做。

那么,回到我的问题:这两种更新 TableView 的方式是否有区别(当然除了动画部分)还是我应该怀疑问题出在其他地方? p>

编辑: 好的,我将尝试解释症状是什么:

cellForRowAtIndexPath 方法中,我为每个单元格添加了一个按钮,并分配了一个标签,该标签等于单元格的 indexPath 行,如下所示:

btn.tag = indexPath.row;

我这样做的原因是我可以识别每个按钮,因为它们都调用相同的函数:

- (void)btnPressed:(id)sender

然后当我更新单元格时 - 因为单元格中的某些值已更改 - 情况 1 使一切正常,但是情况 2 - 混淆了标签,因此下次按下其中一个按钮时,它们不再具有正确的标签。

在我看来,这种混淆确实是随机的,但随机化的发生方式不同,具体取决于我先按下哪个单元格按钮。我希望这能澄清我的问题。

最佳答案

来自UITableView文档

beginUpdates
Begin a series of method calls that insert, delete, or select rows and sections of the receiver.

这意味着,除非您正在插入、删除或选择,否则您不应该使用它。这些你都没有做。

此外,您应该以 endUpdates 结束 beginUpdates,而不是 reloadData。文档:

This group of methods must conclude with an invocation of endUpdates.

关于ios - TableView reloadData 与 beginUpdates & endUpdates,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8174017/

相关文章:

ios - 动态约束更新

ios - 获取 CFAbsoluteTime 和 NSDate 之间的时间差

ios 7 展示了第一个带后退按钮的导航 Controller

ios - 尝试从 viewDidLoad 重新加载可见单元格中的数据

ios - 从 viewDidLoad 中调用的函数外部重新加载 UITableViewController

项目列表数组上的 PHP/Swift JSON 序列化导致零元素

ios - Swift 3 Firebase - (setValue :) Cannot store object of type _SwiftValue at content

objective-c - 使用下标访问 NSArray 的项目

ios - 如何将 collectionview 单元格扩展到全屏

iphone - 在没有重新加载数据的情况下强制在表中进行屏幕更新