UITableView插入控件不应该是可重新排序的

时间:2013-02-09 21:24:12

标签: ios uitableview insertion

我有一个UITableView,我希望能够通过Insertion Control(绿色加图标)插入行。 (我最初使用导航栏上的添加控件,但是使用' back','添加'以及编辑'控件我觉得导航栏有点混乱。

我有这个工作,但我不喜欢这种与重新排序控制交互的方式。我的桌子只有一个部分;插入行将始终显示为表中的最后一行,并且不应重新排序。

我实现了canMoveRowAtIndexPath:为插入控件行返回false,但这只是部分解决方案。这消除了拖动插入行的能力。但是,没有什么可以阻止用户选择可移动的行并将其拖动到插入控制器行下面。 (如果允许,这会导致应用程序崩溃。)

我实施的解决方法是检查moveRowAtIndexPath:toIndexPath中的位置。如果目标位置在插入行下面,我不执行移动,并调用[tableView reloadData]重绘上一个表状态。这种方法很有效,但外观很笨重 - 这一行只是快速回到原先的位置而没有任何迹象表明原因。

这是正确的行为 - 还是有更优雅的解决方案?理想情况下,我希望用户首先无法将行拖到非法位置,但我不确定是否有任何机制可以阻止它。

2 个答案:

答案 0 :(得分:0)

您需要实现tableView:targetIndexPathForMoveFromRowAtIndexPath:toProposedIndexPath:委托方法。实现应返回适当的索引路径,具体取决于行是否可以定位到所需的行。

答案 1 :(得分:0)

以下是实施:

// Don't allow dragging any moveable row below the insertion control
- (NSIndexPath *)tableView:(UITableView *)tableView targetIndexPathForMoveFromRowAtIndexPath:   (NSIndexPath *)sourceIndexPath toProposedIndexPath:(NSIndexPath *)proposedDestinationIndexPath
{
    int proposedRow = proposedDestinationIndexPath.row;
    int maxRow = [[[SADeckStore sharedStore] allDecks] count] - 1;
    if (proposedRow < maxRow)
        return proposedDestinationIndexPath;
    else
        return [NSIndexPath indexPathForRow:maxRow inSection:[proposedDestinationIndexPath section]];
}