如何在重新排序行后重新加载 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
}
}
您不应该在重新订购后致电 reloadData
。
您必须对数据进行与在屏幕上所做的更改相同的更改。
例如:如果您将单元格 nr 2 移动到位置 6,则必须删除填充单元格 nr.2 的对象并将其再次插入位置 6。
您没有提供足够的详细信息,但通常您会将数据保存在一个对象数组中。您必须对该数组进行更改,以便您的支持数据源有效。
这是来自 Apple 的 link 详细信息。
我刚刚在发布答案后阅读了更新。看来你真的需要reloadData
。在这种情况下,我建议在主线程上使用 dispatch_async 块稍作延迟后重新加载。 0.1后说。
我在这里找到了答案:
[tableView beginUpdates];
[tableView endUpdates];
此代码强制 UITableView 仅重新加载单元格大小,而不是单元格内容。
我还不能对 pteofil 的回答发表评论,但他是正确的:如果你在 table 中有一组编号的行,并且你移动一个调用 moveRow(...) 的行,你的动画因为移动将被 tableView.reloadData().
取消
因此我将数据重新加载(它根据更新的数据源重新编号所有可见单元格(当你移动东西时不要忘记这样做!))延迟了几百毫秒,现在它工作得很好而且看起来也很棒。
我让用户重新排序 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
}
}
您不应该在重新订购后致电 reloadData
。
您必须对数据进行与在屏幕上所做的更改相同的更改。
例如:如果您将单元格 nr 2 移动到位置 6,则必须删除填充单元格 nr.2 的对象并将其再次插入位置 6。
您没有提供足够的详细信息,但通常您会将数据保存在一个对象数组中。您必须对该数组进行更改,以便您的支持数据源有效。
这是来自 Apple 的 link 详细信息。
我刚刚在发布答案后阅读了更新。看来你真的需要reloadData
。在这种情况下,我建议在主线程上使用 dispatch_async 块稍作延迟后重新加载。 0.1后说。
我在这里找到了答案:
[tableView beginUpdates];
[tableView endUpdates];
此代码强制 UITableView 仅重新加载单元格大小,而不是单元格内容。
我还不能对 pteofil 的回答发表评论,但他是正确的:如果你在 table 中有一组编号的行,并且你移动一个调用 moveRow(...) 的行,你的动画因为移动将被 tableView.reloadData().
取消因此我将数据重新加载(它根据更新的数据源重新编号所有可见单元格(当你移动东西时不要忘记这样做!))延迟了几百毫秒,现在它工作得很好而且看起来也很棒。