iOS UITableView逐个删除带动画的单元格

时间:2013-10-15 01:50:08

标签: ios objective-c uitableview

我想逐个删除表视图中的一些单元格,我首先使用这样的代码:

[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.淡出第一个单元格空白区域。

但我想要的是逐个删除单元格,首先是第一个单元格是空的并且淡化它,然后是第二个,第三个单元格...我该如何解决?

1 个答案:

答案 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];
    }
});