我有一个带有自定义单元格的表格视图。单元格充满了我的数据。
现在,我要使用户能够重新排列行。我已经实现了这些方法,但是在拖动以重新排序单元格时,我可以看到它显示出它正在尝试执行但无法移动到任何地方的过程。它像10像素一样移动,好像它将进行重新排列,但又回到其位置。如何使用自定义单元格对行进行重新排序?

- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath
{
    if (editingStyle == UITableViewCellEditingStyleDelete)
    {
       [self.dataSource removeObjectAtIndex:indexPath.row];
       [tableView reloadData];
    }
}

-(UITableViewCellEditingStyle)tableView:(UITableView*)tableView editingStyleForRowAtIndexPath:(NSIndexPath*)indexPath
{
    if (self.mytableView.editing)
    {
            return UITableViewCellEditingStyleDelete;
    }
    return UITableViewCellEditingStyleNone;
}

-(BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath
{
    return YES;
}

-(BOOL)tableView:(UITableView *)tableView canMoveRowAtIndexPath:(NSIndexPath *)indexPath
{
    return YES;
}

-(void)tableView:(UITableView *)tableView moveRowAtIndexPath:(NSIndexPath *)sourceIndexPath toIndexPath:(NSIndexPath *)destinationIndexPath
{
    id stringToMove = [self.dataSource objectAtIndex:sourceIndexPath.row];

    [self.dataSource removeObjectAtIndex:sourceIndexPath.row];

    [self.dataSource insertObject:stringToMove atIndex:destinationIndexPath.row];
}

-(NSIndexPath *)tableView:(UITableView *)tableView targetIndexPathForMoveFromRowAtIndexPath:(NSIndexPath *)sourceIndexPath toProposedIndexPath:(NSIndexPath *)proposedDestinationIndexPath
{
    if (proposedDestinationIndexPath.section != sourceIndexPath.section)
    {
            return sourceIndexPath;
    }
    return proposedDestinationIndexPath;
}

最佳答案

我知道这已经很老了,但我仍然会回答。这里的问题是您的tableView: targetIndexPathForMoveFromRowAtIndexPath: toProposedIndexPath:方法(您的最后一个方法)

您的逻辑阻止了任何动作的发生。您的if陈述:

if (proposedDestinationIndexPath.section != sourceIndexPath.section)


的意思是,如果所需位置(用户要携带牢房的位置)不是我的当前位置,请返回我的当前位置(因此不要移动牢房)。否则,如果我的期望位置(我想去的新位置)是我的当前位置,则返回期望位置(实际上是我的当前位置)。

我希望这是有道理的,因此基本上您是在说,无论如何,确保每个单元始终保留在当前位置。要解决此问题,请删除此方法(除非有非法移动,否则不需要此方法)或切换两个return语句,因此:

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

    if (proposedDestinationIndexPath.section != sourceIndexPath.section) {
        return proposedDestinationIndexPath;
    }
    return sourceIndexPath;
}


实际上,允许重新排列的唯一方法是:tableView: moveRowAtIndexPath: toIndexPath:。再说一次,除非您希望其他方法中没有特定的行为,否则您可以保存一些代码并删除其中的大部分(特别是因为在这种情况下,您主要只是实现默认值)。

关于ios - 如何使用自定义单元格重新排列UITableView?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/11878455/

10-15 15:54