重新排序/移动 UITableViewCell 但向后移动

Posted

技术标签:

【中文标题】重新排序/移动 UITableViewCell 但向后移动【英文标题】:Reorder/move UITableViewCell but moves back 【发布时间】:2013-06-14 07:30:20 【问题描述】:

我想实现一种方法来重新排序 tableview 的行。 在每个部分中,我只有一行。当启用 tableview 的编辑状态时,移动指示器显示为预期的。但是当我将其中一个单元格拖到另一个位置时,单元格立即(大约 1 秒后)弹回原始位置。这对我来说很奇怪,因为我已经实现了这样的重新排序功能。这两个项目的不同之处在于新项目实现了一堆手势识别器(例如UILongPressGestureRecognizerUIPanGestureRecognizer、UIPinchGestureRecognizer、..)。我已经考虑过其中一个手势识别器阻止 tableviewcell 的拖动操作的可能性,但事实并非如此。

你可以看到下面的代码:

- (BOOL)tableView:(UITableView *)tableView canMoveRowAtIndexPath:(NSIndexPath *)indexPath 

    return YES;


- (NSIndexPath *)tableView:(UITableView *)tableView targetIndexPathForMoveFromRowAtIndexPath:(NSIndexPath *)sourceIndexPath toProposedIndexPath:(NSIndexPath *)proposedDestinationIndexPath 

    //return [NSIndexPath indexPathForRow:0 inSection:3];

    return nil;


- (void)tableView:(UITableView *)tableView moveRowAtIndexPath:(NSIndexPath *)sourceIndexPath toIndexPath:(NSIndexPath *)destinationIndexPath 

    NSLog(@"%@", destinationIndexPath);

谁能帮帮我?

更新:

我发现移动的 tableviewcell 正在移动到原始目标索引路径。这是否表明表视图上的 reloadData 已经发生?

第二次更新:

因为 Andrei Shender 提到了为什么我在 tableView:targetIndexPathForMoveFromRowAtIndexPath:toProposedIndexPath: 方法中返回 nil,所以您可以在下面找到我的更新代码。

- (NSIndexPath *)tableView:(UITableView *)tableView targetIndexPathForMoveFromRowAtIndexPath:(NSIndexPath *)sourceIndexPath toProposedIndexPath:(NSIndexPath *)proposedDestinationIndexPath 

    return proposedDestinationIndexPath;

   //for testing purpose only
   //return nil;

顺便说一句,当我更改我的代码时,我发现这个方法永远不会被调用。关于Apples documents about reordering tableviewcells,它应该被调用。

【问题讨论】:

这个方法为什么返回nil:tableView:targetIndexPathForMoveFromRowAtIndexPath:toProposedIndexPath: 嗨,好点子!但这只是为了测试。在我当前的更新中,我返回了建议的目标索引路径。我会更新我的代码 tableView:moveRowAtIndexPath:toIndexPath:中实际更改数据源的代码在哪里? 我目前正在这部分编程,完成后我会发布我的解决方案。 【参考方案1】:

感谢posting,我发现了问题所在。将 UIPanGestureRecognizer 和 UITableView 与重新排序/移动功能相结合是一件棘手的事情。

当我编辑 tableview 时,我删除了手势识别器(viewcontroller 的视图),当再次禁用编辑时,我再次添加手势识别器。

【讨论】:

【参考方案2】:

一定要在方法中更新你的数据源:

- (void)tableView:(UITableView *)tableView moveRowAtIndexPath:(NSIndexPath *)sourceIndexPath toIndexPath:(NSIndexPath *)destinationIndexPath

【讨论】:

以上是关于重新排序/移动 UITableViewCell 但向后移动的主要内容,如果未能解决你的问题,请参考以下文章

重新排序单元格时如何在 UITableViewcell 内容视图中添加图像?

UITableViewCell - 控制移动

UITableViewCell 自定义重新排序控件

重新排序单元格后重新加载自定义 UITableViewCell

在编辑模式下重新排序时更改 UITableViewCell 的背景颜色

进入编辑/重新排序模式时的 UITableViewCell 自定义绘图和动画