Iphone 如何使用删除按钮在UITableView中显示重新排序控件

Iphone 如何使用删除按钮在UITableView中显示重新排序控件,iphone,uitableview,ios4,Iphone,Uitableview,Ios4,我阅读了有关如何在UITableView中管理行的删除和重新排序的文档。我创建了编辑按钮,可以删除行。我希望用户能够重新排序的行以及。这看起来很简单,但我不明白如何告诉细胞它们可以移动 要告诉行它们可以被删除,我使用editingStyleForRowAtIndexPath,但如何告诉单元格它也可以被移动,以及在哪里设置ShowsOrderControl?我试图在cellForRowAtIndexPath中放置,但什么都没有显示 谢谢 您必须说行可以移动: - (BOOL)tableView:(

我阅读了有关如何在UITableView中管理行的删除和重新排序的文档。我创建了编辑按钮,可以删除行。我希望用户能够重新排序的行以及。这看起来很简单,但我不明白如何告诉细胞它们可以移动

要告诉行它们可以被删除,我使用editingStyleForRowAtIndexPath,但如何告诉单元格它也可以被移动,以及在哪里设置ShowsOrderControl?我试图在cellForRowAtIndexPath中放置,但什么都没有显示


谢谢

您必须说行可以移动:

- (BOOL)tableView:(UITableView *)tableView canMoveRowAtIndexPath:(NSIndexPath *)indexPath
{
  return YES;
}
并实现此委托以更新数据源:

- (void)tableView:(UITableView *)tableView moveRowAtIndexPath:(NSIndexPath *)sourceIndexPath toIndexPath:(NSIndexPath *)destinationIndexPath

参见上文@benoit答案中添加的内容。如果您的模型恰好是一个可变数组,那么对于tableView:MoveRowatineXpath:toIndexPath:

- (void)tableView:(UITableView *)tableView moveRowAtIndexPath:(NSIndexPath *)fromIndexPath toIndexPath:(NSIndexPath *)toIndexPath
{
    id objectToMove = [_objects objectAtIndex:fromIndexPath.row];
    [_objects removeObjectAtIndex:fromIndexPath.row];
    [_objects insertObject:objectToMove atIndex:toIndexPath.row];    
    [tableView reloadData];
    [self saveObjects];  // A method of your own to make new positions persistent
}

试试这个。这将处理简单tableview情况下单元格的排列和更新

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

- (void)tableView:(UITableView *)tableView moveRowAtIndexPath:(NSIndexPath *)sourceIndexPath toIndexPath:(NSIndexPath *)destinationIndexPath
{
     [tableData insertObject: [tableData objectAtIndex:sourceIndexPath.row] atIndex:destinationIndexPath.row];
     [tableData removeObjectAtIndex:(sourceIndexPath.row + 1)];
}

在我的例子中,我已经实现了所有必需的UITableViewDelegate方法,如Apple文档和此处的答案中所述,但仍然无法看到reorder控件。最终我发现这是因为我重写了layoutSubviews方法,而没有调用super的默认实现。在我添加了[super LayoutSubView]之后,我的重新排序控件终于出现了

我们需要调用[super layoutSubviews]的原因是,当我们切换表的编辑属性时,它将调用单元格的layoutSubviews方法,并且系统提供的控件(如reorder控件)显示在UITableViewCell的默认layoutSubviews方法中。一旦意识到这一点,还可以修改layoutSubviews实现,根据单元格是否正在编辑来更改单元格的外观,以使其在“重新排序”控件出现时不那么笨拙

下面是行重新排序的检查表:

  • 确保实现了委托方法tableView:CanMoveRowatineXpath和tableView:MoveRowatineXpath:toIndexPath
  • 确保tableView的“编辑”属性设置为“是”
  • 如果您有自定义UITableViewCell,请确保调用 [超级布局子视图]如果覆盖此方法

  • 这就是我正在阅读的文档。我已经用这种方式实现了这个方法。但我还是不能移动任何东西。我可以直接删除行。哦,对不起,我刚刚注意到必须实现MoveRowatineXpath。我认为只需要修改数据源。谢谢请注意:您不应该从
    moveRowAtIndexPath:
    回调调用
    insertRowsAtIndexPaths:
    deleteRowsAtIndexPaths: