我有一个有UITableView的应用程序(非常明显,对吧?)。
我编程的一个可能操作会导致单元格(点击时)从“待处理”项目列表移动到“完成”项目列表(所有项目都在同一个单个部分中)。在此向上动画结束时(使用moveRowAtIndexPath:toIndexPath:
完成),可能会将其他项目推送到项目列表的末尾。
所以,在点击之前:
点击第3项(这是动画1)后:
动画1之后:
再次点击此“完成”项目应该将项目“重置”回原始状态(即,将“完成”步骤向下移动到其原始位置,然后删除其他项目。)
所以,在点击之前:
点击第3项(这是动画1)后:
动画1之后:
这是我正在使用的代码:
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];
到目前为止的结果:
有没有人知道为什么会跳过动画只是因为项目是在桌面视图的末尾?
答案 0 :(得分:0)
您发布的代码中存在语法错误(复制后输错?)。以下行不编译:
NSIndexPath *path = [@(oldPath.section):taskIndex];
您可能打算写:
NSIndexPath *path = [NSIndexPath indexPathForRow:taskIndex inSection:oldPath.section];
如果我理解你的逻辑,那么实际上应该使用“newPath.section”。
我怀疑path变量是空的,还是nils数组,或者只包含不存在的路径。这将导致在第一个动画后立即调用reloadTableView
。如果该调用重新加载表,那么它将解释您的问题。