8

我让用户重新排序中的行tableView。因为这个事件会影响内容——单元格中的一些数值应该被更新——在所有其他行中,我调用了reloadDatain moveRowAtIndexPath。然后出现奇怪的效果。

即触摸拖动器时,单元格似乎重叠,并且一些单元格开始上下移动。重要的是要知道,细胞高度是不同的。

奇怪的是,如果我从中删除reloadDatamoveRowAtIndexPath那么所有这些现象都会消失。只有内容无效。

那么我应该如何在重新排序后重新加载数据呢?


更新:我所做的同时重新配置单元格而viewDidLayoutSubviews不是调用reloadData. moveRowAtIndexPath它像我预期的那样工作了 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
    }
}
4

3 回答 3

3

你不应该reloadData在重新订购后打电话。您必须对数据进行相同的更改,就像在屏幕上所做的更改一样。例如:如果您将单元格 nr 2 移动到位置 6,则必须删除填充单元格 nr.2 的对象并将其再次插入到位置 6。您没有提供足够的详细信息,但通常您会将数据保存在对象数组。您必须对此数组进行更改,因此您的支持数据源是有效的。

这是Apple 提供的详细信息链接。

发布答案后,我刚刚阅读了更新。看来你真的需要reloadData。在这种情况下,我建议在主线程上使用 dispatch_async 块稍微延迟后重新加载。在 0.1 之后说。

于 2015-06-17T16:59:15.857 回答
3

我在这里找到了答案:https ://stackoverflow.com/a/4692563/239219

[tableView beginUpdates];
[tableView endUpdates];

此代码强制 UITableView 仅重新加载单元格大小,而不是单元格内容。

于 2015-06-18T10:50:50.743 回答
0

我还不能评论 pteofil 的回答,但他是正确的:如果你在一个表中有一组编号的行,并且你移动一个调用 moveRow(...),你的移动动画将被 tableView 取消.reloadData()。

因此,我将数据重新加载(它根据更新的数据源重新编号所有可见单元格(当你移动东西时不要忘记这样做!))延迟了几百毫秒,它现在完美运行并且看起来也很棒。

于 2016-11-02T22:09:51.863 回答