我可以在tableview中拖动部分,因为我可以使用行吗?

时间:2011-04-14 12:40:11

标签: iphone uitableview drag-and-drop

我用

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

在部分内和部分之间拖放行的方法。我也可以用部分执行拖动吗?

2 个答案:

答案 0 :(得分:2)

从概念上(以及技术上)可能更简单地将一个级别退回到表视图,其中每一行对应于要重新排序的表的各个部分。也许你可以通过“重新订购部分”按钮来调用它,显示section-table-view,重新排序,然后在详细信息表视图上强制重新排序。  我想如果你试图在一张桌子里做这一切,你就会让自己和用户感到沮丧。我的2美分。 -Mike

答案 1 :(得分:1)

老问题,我知道,但我刚刚实现了自己做的事情,所以我想分享答案,以防其他人偶然发现这一点。

我的基本方法是在每个部分的顶部添加一个代表该部分的行。我还在每个部分的末尾添加了一个“添加新部分”行,其编辑样式为UITableViewCellEditingStyleInsert,以允许直接在视图中创建新部分。因此,对于每个部分,行如下:

  • 第0行=部分行(通过设置不同来进行视觉区分 背景颜色)
  • 第1行到第x行=正常数据行
  • 第x + 1行=“添加新的部分”

(我有几种简单的方法可以在“编辑模式indexPath”和“真实数据indexPath”之间进行转换。)

对于移动部分,在UITableViewDelegate Protocol方法tableView:targetIndexPathForMoveFromRowAtIndexPath:toProposedIndexPath:中检查建议的移动,以确保部分行已“移动得足够远”(在另一部分行的上方或下方)。返回的indexPath被剪切到最近的部分行的上方或下方(取决于是向上还是向下移动),以便向用户显示它将被移动的位置。

tableView:moveRowAtIndexPath:toIndexPath:中,在数据源中进行了部分更改,然后将reloadData消息发送到tableView以显示更改。使用reloadData代替moveSection:toSection:,因为对于后者,由于行移动,数据源和显示将不同步,并会导致异常。