2011-11-17 59 views
21

我得到了关于更新我的TableView一个棘手的问题,我得到使用更新它的不同的方法不同的结果,让我解释一下:的TableView reloadData与beginUpdates&endUpdates

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

情况2: 我使用:

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

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

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

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

编辑: 好吧,我会尽量解释什么症状:

cellForRowAtIndexPath - 方法我添加一个按钮,每个单元有分配的标签等于细胞的indexPath行像这样的:

btn.tag = indexPath.row; 

我之所以这样做,这是这样我就可以识别每个按钮都调用相同的功能:

- (void)btnPressed:(id)sender 

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

混淆确实对我来说看起来是随机的,但随机发生的方式取决于我先按哪个单元格按钮。我希望这能够澄清我的问题。

+1

“我得到了不同的结果”,“这不符合预期。”以什么方式? – TigerCoding

+0

那么,每个单元格在创建时都会得到一个按钮,并带有一个标签,其中'按钮标签=索引路径行'。在情况1中,按钮在情况2中获得正确的标签 - 它没有。 –

回答

19

UITableView文档

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

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

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

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

+1

啊,是的'reloadData'位在我的文章中是一个错字 - 我的不好。 –

+0

好的,这比reloadData和beginUpdates/endUpdates之间的区别得到了结论,但我真的不知道这些差别会如何影响我的结果。我意识到我在描述后果时有点模糊,我会在几分钟内更新我的原始问题。 –

+0

尝试删除'beginUpdates'和'endUpdates'。它们不属于'updateRowsAtIndexPaths'。 – Mundi

3

reloadDatareloadRowsAtIndexPaths之间的第一个不同之处在于存在用于相同indexPath simulteaneosuly分配2个UITableViewCell对象做时reloadRowsAtIndexPaths(因为tableview中“共混物”在新的小区)。有时候cellForRowAtIndexPath中的代码没有预见到这种情况。令人惊讶的是,即使已经为特定的小区标识符分配了某个单元格,但在调用reloadRowsAtIndexPaths时,表格视图并不会在dequeueReusableCellWithIdentifier中返回该单元格,而是返回nil 。相反,reloadData重用它已分配的单元格。

的第二个区别是,endUpdatesreloadRowsAtIndexPaths后直接调用cellForRowAtIndexPath(如果设置一个断点,endUpdates在堆栈跟踪中可见),而reloadData安排在稍后的时间调用cellForRowAtIndexPath(在堆栈跟踪不可见) 。

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

+0

谢谢你的回答Leo。这已经过去了几年,我不记得这个项目发生了什么,但是我怀疑我是否曾经解决过这个问题,希望这个Q和你和@Mundi给出的答案可以帮助其他有类似问题的人。 –

0

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

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

相关问题