我想逐个删除表视图中的一些单元格,我首先使用这样的代码:
[self beginUpdates];
[self deleteRowsAtIndexPaths:removeIndexPaths withRowAnimation:UITableViewRowAnimationFade];
[self endUpdates];
removeIndexPaths数组中有六个indexPath。它以正确的方式工作,但动画效果为1.六个单元格为空,2。淡化空白区域。
然后我尝试使用for / while删除它们,如下所示:
int removeIndexRow = indexPath.row + 1;
while (item.level < nextItemInDisplay.level)
{
NSIndexPath *removeIndexPath = [NSIndexPath indexPathForRow:removeIndexRow inSection:0];
[items removeObject:nextItemInDisplay];
[self beginUpdates];
[self deleteRowsAtIndexPaths:@[removeIndexPath] withRowAnimation:UITableViewRowAnimationFade];
NSLog(@"1");
sleep(1);
NSLog(@"2");
[self endUpdates];
}
为了了解函数的工作原理,我使用sleep和NSLog输出一些标志。然后我发现结果是在输出所有标志后,六个单元格一起关闭,最令人难以置信的是它们的动画如下:1。五个单元格消失,没有动画,2。第一个单元格为空, 3.淡出第一个单元格空白区域。
但我想要的是逐个删除单元格,首先是第一个单元格是空的并且淡化它,然后是第二个,第三个单元格...我该如何解决?
答案 0 :(得分:3)
问题是你的循环(在其中调用了sleep
)正在UI线程上运行。在将UI线程的控制权返回给操作系统之前,UI不会更新,因此它可以执行必要的动画。
尝试在另一个线程中运行它,并调用在UI线程上逐个删除单元格。代码看起来像这样:
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
// Now we're running in some thread in the background, and we can use it to
// manage the timing of removing each cell one by one.
for (int i = 0; i < 5; i++)
{
dispatch_async(dispatch_get_main_queue(), ^{
// All UIKit calls should be done from the main thread.
// Make the call to remove the table view cell here.
});
// Make a call to a sleep function that matches the cell removal
// animation duration.
// It's important that we're sleeping in a background thread so
// that we don't hold up the main thread.
[NSThread sleepForTimeInterval:0.25];
}
});