如何使用自定义单元格重新排列UITableView?

时间:2012-08-09 07:14:16

标签: ios objective-c uitableview

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

1 个答案:

答案 0 :(得分: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:。所以,除非你想要其他方法中的特定行为,你可以保存一些代码并删除大部分代码(特别是因为在这种情况下你主要只是实现默认值)。