2010-12-08 53 views
12

我阅读了有关如何管理UITableView中行的删除和重新排序的文档。我创建了编辑按钮,我可以删除行。我希望用户能够对行重新排序。这似乎很简单,但我不明白如何告诉细胞,他们可以被移动。如何使用删除按钮显示UITableView中的重新排序控件

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

谢谢!

回答

32

你不得不说,行可以被移动:

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

和实施该委托更新您的数据源:

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

Table View Programming Guide for iOS

+0

这就是牛逼他正在阅读的文档。我已经完全按照这种方式实现了该方法。但我仍然无法移动任何东西。我可以删除行。 – 2010-12-08 13:26:23

2

Managing the Reordering of Rows添加到@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 
} 
1

尝试。 。 。这将处理简单的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)]; 
} 
4

在我的情况下,苹果的文件中,并在这里的答案中提到我已经实现了所有必需的UITableViewDelegate方法安排和细胞的更新,但仍不能看到的重新排序控制。最终我发现这是因为我重写了layoutSubviews方法而不调用超级的默认实现。在我添加[super layoutSubviews]之后,我的重新排序控件终于出现了。

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

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

  1. 确保委托方法的tableView:canMoveRowAtIndexPath和的tableView:moveRowAtIndexPath:toIndexPath实现
  2. 确保的tableView的编辑属性设置为YES
  3. 如果你有一个自定义的UITableViewCell,请确保您拨打 [超级layoutSubviews]如果重写此方法
相关问题