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

Posted

技术标签:

【中文标题】如何使用删除按钮在 UITableView 中显示重新排序控件【英文标题】:How to show the reorder controls in UITableView with delete buttons 【发布时间】:2010-12-08 12:23:44 【问题描述】:

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

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

谢谢!

【问题讨论】:

【参考方案1】:

你不得不说行可以移动:

- (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

【讨论】:

这就是我正在阅读的文档。我已经以这种方式实现了该方法。但我还是不能动任何东西。我可以删除行。 抱歉,我刚刚注意到必须执行 moveRowAtIndexPath。我认为只需要修改数据源。谢谢! 请注意:你不应该在moveRowAtIndexPath:回调中调用insertRowsAtIndexPaths:deleteRowsAtIndexPaths:【参考方案2】:

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

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

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

    确保实现了委托方法 tableView:canMoveRowAtIndexPath 和 tableView:moveRowAtIndexPath:toIndexPath 确保 tableView 的编辑属性设置为 YES 如果您有自定义 UITableViewCell,请确保调用 [super layoutSubviews] 如果你重写了这个方法

【讨论】:

【参考方案3】:

添加到上面的@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

【讨论】:

【参考方案4】:

试试这个。 . .this 将在简单的表格视图的情况下处理单元格的排列和更新

- (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)];

【讨论】:

以上是关于如何使用删除按钮在 UITableView 中显示重新排序控件的主要内容,如果未能解决你的问题,请参考以下文章

如何向右滑动隐藏 UITableView 中的删除按钮?

如何在ios的UITableview中选择样式为无时显示选择按钮?

以编程方式编辑 UITableView 在所有行上显示删除按钮

如何在 UITableView 中删除箭头

当显示删除按钮时,IPhone UITableView 抑制显示按钮

如何在 iphone 中刷新 UITableView?