TableView reloadData与beginUpdates和endUpdates

Tob*_*dal 31 objective-c reloaddata ios

我有一个关于更新我的TableView的棘手问题,我使用不同的更新方法得到不同的结果,让我解释一下:

情况1: 我用[tbl reloadData];哪里tbl是我的TableView,以更新的TableView -按预期工作.

情况2: 我使用:

[tbl beginUpdates];
[tbl reloadRowsAtIndexPaths:indexPaths withRowAnimation:UITableViewRowAnimationRight];
[tbl endUpdates];
Run Code Online (Sandbox Code Playgroud)

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

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

那么,直到我的问题:更新TableView的两种方式之间是否存在差异(当然除了动画位)或者我是否应该怀疑问题在其他地方?

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

cellForRowAtIndexPath-method中,我为每个单元格添加一个按钮,其中指定的标签等于单元格的indexPath行,如下所示:

btn.tag = indexPath.row;
Run Code Online (Sandbox Code Playgroud)

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

- (void)btnPressed:(id)sender
Run Code Online (Sandbox Code Playgroud)

当我然后更新单元格 - 因为单元格中的某些值已经改变 - 情境1使一切正常,情况2然而 - 混合标签,以便下次按下其中一个按钮时,它们不再具有正确的标签.

混音对我来说确实是随机的,但随机化的发生方式也不同,这取决于我先按哪个单元格按钮.我希望这能澄清我的问题.

Mun*_*ndi 22

UITableView文档中

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

这意味着,除非您要插入,删除或选择,否则不应使用此项.你这两个都没做.

此外,你应该结束beginUpdatesendUpdates,不reloadData.文档:

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


Leo*_*Leo 5

reloadData和之间的第一个区别reloadRowsAtIndexPathsUITableViewCell在执行时为同一个indexPath分配了两个对象simulteaneosuly reloadRowsAtIndexPaths(因为tableview'在新单元格中混合').这有时候不会被代码所预见cellForRowAtIndexPath.令人惊讶的是,即使一个单元格已经分配给特定的单元格标识符,表格视图也不会在dequeueReusableCellWithIdentifier调用时返回该单元格reloadRowsAtIndexPaths,而是返回nil.矛盾reloadData重用它已经分配的单元格.

第二个区别是endUpdatesreloadRowsAtIndexPaths直接调用之后cellForRowAtIndexPath(如果在那里设置断点,endUpdates在堆栈跟踪中可见),而 在稍后reloadData调度调用cellForRowAtIndexPath(在堆栈跟踪中不可见).

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