重新排序后如何重新加载tableview?行的高度可变

时间:2015-06-09 15:13:30

标签: ios uitableview heightforrowatindexpath reorderlist

我让用户重新排序tableView中的行。由于此事件会影响内容 - 应更新单元格中的某些数值 - 在所有其他行中,我在reloadData中调用moveRowAtIndexPath。然后发生奇怪的效果。

即。当触摸拖动器时,细胞似乎重叠,并且一些细胞开始上下移动。重要的是要知道,细胞高度是变化的。

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

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

更新:我在viewDidLayoutSubviews中重新配置单元格而不是reloadData的{​​{1}}调用结束时所执行的操作。它的工作效果比我预期的要高90%,但是有时行仍然有点高。

moveRowAtIndexPath

3 个答案:

答案 0 :(得分:3)

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

/templates/fields/%7B%7Belem.template_name%7D%7D.html 404 (Not Found) 

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

答案 1 :(得分:2)

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

这是Apple的详细信息link

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

答案 2 :(得分:0)

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

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