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

时间:2010-12-08 12:23:45

标签: iphone uitableview ios4

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

要告诉他们可以删除的行我使用editingStyleForRowAtIndexPath,但是如何告诉单元格它也可以被移动以及我在哪里设置showsReorderControl?我试图放在cellForRowAtIndexPath中,但没有显示任何内容。

谢谢!

4 个答案:

答案 0 :(得分:36)

你必须说可以移动行:

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

并实现此委托以更新您的数据源:

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

请参阅Managing the Reordering of Rows

Table View Programming Guide for iOS

答案 1 :(得分:4)

在我的情况下,我已经实现了Apple文档和答案中提到的所有必需的UITableViewDelegate方法,但仍然看不到重新排序控件。最终我发现它是因为我在没有调用super的默认实现的情况下覆盖了layoutSubviews方法。添加[super layoutSubviews]后,我的重新排序控件终于出现了。

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

所以这是行重新排序的清单:

  1. 确保委托方法tableView:canMoveRowAtIndexPath和tableView:moveRowAtIndexPath:toIndexPath已实现
  2. 确保tableView的编辑属性设置为YES
  3. 如果您有自定义UITableViewCell,请务必致电 [super layoutSubviews]如果覆盖此方法

答案 2 :(得分:2)

添加到@benoit上面的答案。如果你的模型恰好是一个可变数组,那么这样就足够了tableView:moveRowAtIndexPath: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
}

答案 3 :(得分:2)

试试这个。 。 。这将在简单的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)];
}