簡體   English   中英

重新排序后如何重新加載tableview? 行具有可變高度

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM