UITableView deleteRowsAtIndexPaths:withRowAnimation:不动画删除

时间:2013-12-03 02:48:48

标签: ios uitableview

我有一个有UITableView的应用程序(非常明显,对吧?)。

我编程的一个可能操作会导致单元格(点击时)从“待处理”项目列表移动到“完成”项目列表(所有项目都在同一个单个部分中)。在此向上动画结束时(使用moveRowAtIndexPath:toIndexPath:完成),可能会将其他项目推送到项目列表的末尾。

所以,在点击之前:

  • 第1项 - Undone
  • 第2项 - Undone
  • 第3项 - Undone
  • 第4项 - Undone

点击第3项(这是动画1)后:

  • 第3项 - 完成
  • 第1项 - Undone
  • 第2项 - Undone
  • 第4项 - Undone

动画1之后:

  • 第3项 - 完成
  • 第1项 - Undone
  • 第2项 - Undone
  • 第4项 - Undone
  • 第5项 - Undone
  • 第6项 - Undone

再次点击此“完成”项目应该将项目“重置”回原始状态(即,将“完成”步骤向下移动到其原始位置,然后删除其他项目。)

所以,在点击之前:

  • 第3项 - 完成
  • 第1项 - Undone
  • 第2项 - Undone
  • 第4项 - Undone
  • 第5项 - Undone
  • 第6项 - Undone

点击第3项(这是动画1)后:

  • 第1项 - Undone
  • 第2项 - Undone
  • 第3项 - Undone
  • 第4项 - Undone
  • 第5项 - Undone
  • 第6项 - Undone

动画1之后:

  • 第1项 - Undone
  • 第2项 - Undone
  • 第3项 - Undone
  • 第4项 - Undone

这是我正在使用的代码:

NSMutableArray *array = [self.owner.tableViewTaskArray mutableCopy];
[array sortUsingComparator:app.orderChecklist];
NSInteger taskIndex = [array indexOfObject:self.cellTask];
NSIndexPath *newPath = [@(oldPath.section):taskIndex];


[self.owner.tableView beginUpdates];
[self.owner.tableView moveRowAtIndexPath:oldPath toIndexPath:newPath];
[CATransaction setCompletionBlock:^{
    // Get the current list
    NSMutableArray *oldArray = [self.owner.tableViewTaskArray mutableCopy];                        
    // Process the un-completion logic
    [self.cellTask removeAutoPushTasksFromCurrentChecklist];
    // This call resets tableViewTaskArray
    [self.owner numberOfSectionsInTableView:self.owner.tableView];
    // Get the now-current list
    NSMutableArray *newArray = [self.owner.tableViewTaskArray mutableCopy];
    // Using a temp array, figure out current location of cells to delete
    NSMutableArray *oldArrayCopy = [oldArray mutableCopy];
    [oldArrayCopy removeObjectsInArray:newArray];
    NSMutableArray *paths = [NSMutableArray array];
    for (MSSTask *task in oldArrayCopy) {
        NSInteger taskIndex = [oldArray indexOfObject:task]; 
        NSIndexPath *path = [@(oldPath.section):taskIndex];
        [paths addObject:path];
    }
    // Delete those cells
    [self.owner.tableView beginUpdates];
    [self.owner.tableView deleteRowsAtIndexPaths:paths withRowAnimation:UITableViewRowAnimationRight];
    [CATransaction setCompletionBlock:^{
        // This seems to not be called automatically, so make it called at END of animation
        [self.owner reloadTableView];
    }
      ];
    [self.owner.tableView endUpdates];
}
  ];
[self.owner.tableView endUpdates];

到目前为止的结果:

  1. 我的逻辑工作正常(即我的数据源被正确操作)。
  2. 所有“撤消 - >完成”逻辑都按预期工作(向上移动,然后添加新行)。
  3. 从“完成”部分到“撤消”部分的动画正在运行(即“完成 - >取消”过程中的动画1)。
  4. 在项目动画返回其原始位置后,其推送的其他项目将从tableview的末尾删除,但这不会发生任何动画。他们只是消失了。
  5. 当发生类似的动画,但要删除的项目位于tableview项目列表的中间时,动画将按照需要运行。
  6. 有没有人知道为什么会跳过动画只是因为项目是在桌面视图的末尾?

1 个答案:

答案 0 :(得分:0)

您发布的代码中存在语法错误(复制后输错?)。以下行不编译:

NSIndexPath *path = [@(oldPath.section):taskIndex];

您可能打算写:

NSIndexPath *path = [NSIndexPath indexPathForRow:taskIndex inSection:oldPath.section];

如果我理解你的逻辑,那么实际上应该使用“newPath.section”。

我怀疑path变量是空的,还是nils数组,或者只包含不存在的路径。这将导致在第一个动画后立即调用reloadTableView。如果该调用重新加载表,那么它将解释您的问题。