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的调用结束。
reloadData
和reloadRowsAtIndexPaths
之间的第一个区别在于,在执行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。