TableView reloadData与beginUpdates&endUpdates

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

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

情况2:我用:

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

其中tbl是我的TableView,而indexPaths是包含TableView中存在的所有indexPath的数组。 现在数组没有问题,它包含了所有正确的indexPaths(双重和三重检查),但由于某种原因 – 这是行不通的。

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

所以,回到我的问题:更新TableView的两种方法(当然除了animation位)之间是否有区别?还是我应该怀疑问题在别处?

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

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

 btn.tag = indexPath.row; 

我这样做的原因是,我可以识别每个button,因为他们都调用相同的function:

 - (void)btnPressed:(id)sender 

当我更新单元格时 – 因为单元格中的某些值已经改变 – 情况1使一切正常工作,然而情况2 – 混合了标签,所以下一次按下其中一个button时,它们不再具有正确的标签。

混淆对我来说看起来是随机的,但是随机化的发生取决于我先按哪个单元格button。 我希望这可以澄清我的问题。

UITableView文档

beginUpdates
开始一系列方法调用,插入,删除或select接收者的行和部分。

这意味着,除非您插入,删除或select,否则不应使用此项。 你没有做这些。

另外,你应该用endUpdates结束beginUpdates ,而不是reloadData 。 文档:

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

reloadDatareloadRowsAtIndexPaths之间的第一个区别在于,在执行reloadRowsAtIndexPaths (因为tableview在新单元格中“混合”),有2个UITableViewCell对象为同一个indexPath分配simulteaneosuly。 有时, cellForRowAtIndexPath的代码没有预见到这一点。令人惊讶的是,即使已经为特定的单元格标识符分配了一个单元格,但在调用reloadRowsAtIndexPaths ,表格视图并不会返回此单元格中的dequeueReusableCellWithIdentifier ,而是返回nil 。 矛盾reloadData重用它已经分配的单元格。

第二个不同之处在于reloadRowsAtIndexPaths直接调用cellForRowAtIndexPath (如果在那里设置了一个断点, endUpdates在堆栈跟踪中是可见的),而reloadData在稍后调度cellForRowAtIndexPath (在堆栈跟踪中不可见),那么endUpdates就会被调用。

但是,您需要发布更多代码,以便让我们了解您在此处所做的工作。 原则上,只要不删除或插入行,新的单元格的索引path也与旧的单元格一样,也是reloadRowsAtIndexPaths

如果您希望后续插入,删除和select操作(例如,cellForRowAtIndexPath:和indexPathsForVisibleRows)同时进行animation,请调用此方法。

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