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

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

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

谢谢!

【问题讨论】:

    标签: iphone uitableview ios4


    【解决方案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 实现,以根据是否正在编辑单元格来更改单元格的外观,以使其在重新排序控件出现时不那么笨拙。

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

    1. 确保实现了委托方法 tableView:canMoveRowAtIndexPath 和 tableView:moveRowAtIndexPath:toIndexPath
    2. 确保 tableView 的编辑属性设置为 YES
    3. 如果您有自定义 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)];
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-04-05
          • 1970-01-01
          • 1970-01-01
          • 2011-06-09
          • 1970-01-01
          相关资源
          最近更新 更多