我正在修改一些现有的笨拙代码,只需简单地调用[tableView reloadData]
就可以对任何更改使用更具体的表格更新与插入/删除方法。UITableView insertSections:withRowAnimation:导致请求所有表格单元格
但是,我得到这样做有一些非常糟糕的行为。以前,正如人们所想象的那样,当表格加载时,它只会请求单元格用于当时可见的行。这是使用reloadData
时的行为。
现在insertSections
被调用,全部该更新后,请求单元格,可能是数百。这会导致为每一行创建单元格,从而彻底破坏可重用的单元队列,并造成浪费。我必须做错了什么。
的变化是这样的简单,代码导致的tableView要求仅适用于可见行:
- (void)observeValueForKeyPath:(NSString *)keyPath
ofObject:(id)object
change:(NSDictionary *)change
context:(void *)context {
// ... ensure it's the right key
NSUInteger sectionCount = [self sectionCount];
NSIndexSet *indices = [NSIndexSet indexSetWithIndexesInRange:NSMakeRange(0, sectionCount)];
[tableView insertSections:indices withRowAnimation:UITableViewRowAnimationFade];
}
我可以切换回:那导致的tableView要求一切
- (void)observeValueForKeyPath:(NSString *)keyPath
ofObject:(id)object
change:(NSDictionary *)change
context:(void *)context {
// ... ensure it's the right key
[tableView reloadData];
}
代码并且看到行为改变。令人沮丧。想法?
添加赏金只是为了看看有没有人有更多的见解。
的beginUpdates/endUpdates不会影响任何东西,我不希望它来,这只是一个命令,没有什么额外的凝聚成一个单一的更新。
我想这仅仅是希望动画的副作用。为了让所有内容“滑动”,它必须呈现一切。游戏结束。
你是怎么确定所有的单元格一次都被请求的?没有人出列? – Pascal 2009-10-27 15:15:10
我创建了一个小型测试项目,可以重现您正在观察的行为。它真的很好奇。如果您指定了UITableViewRowAnimationNone,则行为是相同的,因此不能仅仅是动画。 如果insertSections:withRowAnimation:被调用时插入位置不在屏幕上,则不会发生此问题。 – 2009-10-27 22:15:52