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
开始一系列方法调用,插入,删除或选择接收器的行和部分.
这意味着,除非您要插入,删除或选择,否则不应使用此项.你这两个都没做.
此外,你应该结束beginUpdates与endUpdates,不reloadData.文档:
这组方法必须以调用endUpdates结束.
reloadData和之间的第一个区别reloadRowsAtIndexPaths是UITableViewCell在执行时为同一个indexPath分配了两个对象simulteaneosuly reloadRowsAtIndexPaths(因为tableview'在新单元格中混合').这有时候不会被代码所预见cellForRowAtIndexPath.令人惊讶的是,即使一个单元格已经分配给特定的单元格标识符,表格视图也不会在dequeueReusableCellWithIdentifier调用时返回该单元格reloadRowsAtIndexPaths,而是返回nil.矛盾reloadData重用它已经分配的单元格.
第二个区别是endUpdates在reloadRowsAtIndexPaths直接调用之后cellForRowAtIndexPath(如果在那里设置断点,endUpdates在堆栈跟踪中可见),而 在稍后reloadData调度调用cellForRowAtIndexPath(在堆栈跟踪中不可见).
但是,您需要发布更多代码,以便让我们了解您在那里所做的事情.原则上reloadRowsAtIndexPaths,只要不删除或插入行,新单元格的indexPaths与旧单元格的indexPaths相同.
| 归档时间: |
|
| 查看次数: |
42794 次 |
| 最近记录: |