[英]How to reload tableview after reordering a row? Rows have variable height
我讓用戶重新排序tableView
行。 因為此事件會影響內容 - 單元格中的某些數值應該更新 - 在所有其他行中,我在moveRowAtIndexPath
調用reloadData
。 然后發生奇怪的效果。
即觸摸拖動器時,細胞似乎重疊,並且一些細胞開始上下移動。 重要的是要知道,細胞高度是變化的。
奇怪的是,如果我從moveRowAtIndexPath
刪除reloadData
,那么所有這些現象都會消失。 只有內容無效。
那么重新排序后如何重新加載數據呢?
更新:我在同時重新配置viewDidLayoutSubviews
單元格而不是調用moveRowAtIndexPath
reloadData
結束。 它的工作效果比我預期的要高90%,但有時它們的行數仍然有些高。
override func tableView(tableView: UITableView, moveRowAtIndexPath sourceIndexPath: NSIndexPath, toIndexPath destinationIndexPath: NSIndexPath) {
//..
reorderOccured = true
}
override func viewDidLayoutSubviews() {
if reorderOccured {
for cell in tableView.visibleCells() as! [UITableViewCell] {
let ip = tableView.indexPathForCell(cell)
if ip != nil {
self.configureCell(cell, indexPath: ip!)
}
}
reorderOccured = false
}
}
我在這里找到答案: https : //stackoverflow.com/a/4692563/239219
[tableView beginUpdates];
[tableView endUpdates];
此代碼強制UITableView僅重新加載單元格大小,而不是單元格內容。
重新排序后不應調用reloadData
。 您必須對數據進行相同的更改,就像在屏幕上進行的更改一樣。 例如:如果將單元格nr 2移動到位置6,則必須刪除填充單元格nr.2的對象並在位置6再次插入。您沒有提供足夠的詳細信息,但通常會將數據保存在對象數組。 您必須對此數組進行更改,因此您的支持數據源有效。
這是Apple的詳細信息鏈接 。
在我發布答案后,我剛剛閱讀了更新內容。 看起來你真的需要reloadData
。 在這種情況下,我建議在主線程上使用dispatch_async塊稍微延遲后重新加載。 0.1之后說。
我還不能評論pteofil的答案,但他是正確的:如果你在一個表中有一組編號的行,並且你移動一個調用moveRow(...),你的動畫將被tableView取消.reloadData()。
因此,我延遲了數據重新加載(根據更新的數據源對所有可見單元進行重新編號(當你移動東西時不要忘記這樣做!))幾百毫秒,它現在完美地工作,看起來也很棒。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.