0

我有一个 UITableView,我希望能够通过插入控件(绿色加号图标)插入行。(我最初使用导航栏上的“添加”控件,但使用“返回”、“添加”和“编辑”控件时,我觉得导航栏有点混乱)。

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

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

我实施的解决方法是检查 moveRowAtIndexPath:toIndexPath 中的 to 位置。如果目标位置在插入行的下方,我不执行移动,调用[tableView reloadData]重绘之前的表格状态。这行得通,但外观很笨拙——该行只是突然回到之前的位置,没有说明原因。

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

4

2 回答 2

0

您需要实现tableView:targetIndexPathForMoveFromRowAtIndexPath:toProposedIndexPath:委托方法。实现应该根据行是否可以定位到所需的行来返回适当的索引路径。

于 2013-02-09T21:53:33.153 回答
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]];
}
于 2013-02-10T19:16:52.370 回答