0

我有一个带有自定义单元格的表格视图。单元格中充满了我的数据。现在我想让用户重新排列行。我已经实现了这些方法,但是在拖动以重新排序单元格时,我可以看到它显示为它正在尝试执行但无法移动到任何地方。它像 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;
}
4

1 回答 1

1

我知道这是旧的,但我仍然会回答它。这里的问题在于您的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:. 再说一次,除非您希望从其他方法中获得特定行为,否则您可以保存一些代码并删除其中的大部分(特别是因为在这种情况下您主要只是实现默认值)。

于 2013-06-27T22:22:01.720 回答