37

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

情况 1: 我使用[tbl reloadData];where tblis my TableView 来更新 TableView - 按预期工作。

情况2: 我使用:

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

我的 TableView在哪里tbl,并且indexPaths是一个包含 TableView 中存在的所有 indexPaths 的数组。现在数组很好,它包含所有正确的 indexPaths(双重和三重检查),但由于某种原因 - 这不能按预期工作。

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

所以,归结为我的问题:更新 TableView 的两种方式之间是否有区别(当然除了动画位)还是我应该怀疑问题出在其他地方?

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

在- 方法中cellForRowAtIndexPath,我向每个单元格添加一个按钮,其分配的标签等于单元格的 indexPath 行,如下所示:

btn.tag = indexPath.row;

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

- (void)btnPressed:(id)sender

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

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

4

3 回答 3

28

UITableView文档

beginUpdates
开始一系列插入、删除或选择接收器的行和部分的方法调用。

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

此外,您应该以 结尾beginUpdatesendUpdates而不是reloadData。文档:

这组方法必须以调用 endUpdates 结束。

于 2011-11-17T20:49:20.070 回答
7

reloadData和之间的第一个区别是,在执行操作时,同时为同一个 indexPath 分配了reloadRowsAtIndexPaths2 个对象(因为 tableview 在新单元格中“混合”)。中的代码有时无法预见到这一点。令人惊讶的是,即使已经为特定的单元格标识符分配了一个单元格,表格视图在调用时也不会返回这个单元格,而是返回 nil。矛盾地重用了它已经分配的单元格。UITableViewCellreloadRowsAtIndexPathscellForRowAtIndexPathdequeueReusableCellWithIdentifierreloadRowsAtIndexPathsreloadData

第二个区别是直接调用endUpdates之后(如果在那里设置断点,则在堆栈跟踪中可见),而 将调用安排在稍后的时间(在堆栈跟踪中不可见)。reloadRowsAtIndexPathscellForRowAtIndexPathendUpdatesreloadDatacellForRowAtIndexPath

但是,您需要发布更多代码才能让我们了解您在那里所做的事情。reloadRowsAtIndexPaths原则上,只要您不删除或插入行,新单元格的 indexPaths 也与旧单元格相同。

于 2015-05-03T20:52:58.213 回答
2

如果您希望后续的插入、删除和选择操作(例如,cellForRowAtIndexPath: 和 indexPathsForVisibleRows)同时进行动画处理,请调用此方法。

我想这就是你想要的。beginUpdates & endUpdates 可以用动画改变 UItableview。

于 2015-07-16T17:58:37.363 回答