3

我想实现一种方法来重新排序 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 关于重新排序 tableviewcells 的文档,它应该被调用。

4

2 回答 2

3

多亏了这篇文章,我才知道问题出在哪里。将 UIPanGestureRecognizer 和 UITableView 与重新排序/移动功能结合起来是一件棘手的事情。

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

于 2013-06-14T08:20:10.013 回答
0

请务必在方法中更新您的数据源:

- (void)tableView:(UITableView *)tableView moveRowAtIndexPath:(NSIndexPath *)sourceIndexPath toIndexPath:(NSIndexPath *)destinationIndexPath
于 2013-06-14T08:15:40.100 回答