【问题标题】:How to reload tableview after reordering a row? Rows have variable height重新排序行后如何重新加载tableview?行具有可变高度
【发布时间】:2015-08-24 12:13:41
【问题描述】:

我让用户重新排序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
    }
}

【问题讨论】:

标签: ios uitableview heightforrowatindexpath reorderlist


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

    [tableView beginUpdates];
    [tableView endUpdates];
    

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

    【讨论】:

    【解决方案3】:

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

    这是来自 Apple 的 link 详细信息。

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

    【讨论】:

    • 如果您阅读 UPDATE-ed 部分,我不再调用 reloadData,而是在 viewDidLayoutSubviews 中为每个单元格调用 reconfigureCell,但有时我仍然会出现重叠现象
    • 你是否在不同的高度重复使用同一个单元格?那么它的原因
    • 与您链接的文章相关,如果行高度相同,则不会出现重叠现象
    • @anishparajuli 我只有一个原型单元在使用,我是dequeueReusableCellWithIdentifier 当然,我认为它们可以有不同的高度,我已经实现了heightForRowAtIndexPath
    • 那是你错过的地方......想想条件......在 heightforrowatindexpath 中定义的更大高度(假设为 40)的单元格重用了大小仅为 20 的单元格 0?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-30
    • 1970-01-01
    • 1970-01-01
    • 2016-11-09
    相关资源
    最近更新 更多