我正在修改一些現有的笨拙代碼,只需簡單地調用[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