在表视图删除行动画完成后运行其他代码

时间:2013-08-27 21:33:56

标签: ios ios6 uitableview

我使用标准表视图数据源协议删除表格单元格:

-(void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath
{
    if(editingStyle == UITableViewCellEditingStyleDelete)
    {
        [tableView deleteRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationFade];
    }
}

我想在动画完成后运行一些其他代码,但 deleteRowsAtIndexPaths:withRowAnimation 方法没有完成块。在这个方法完成后我怎么能运行一些代码呢?

2 个答案:

答案 0 :(得分:7)

对于iOS 6 Apple将- tableView:didEndDisplayingCell:forRowAtIndexPath:添加到UITableViewDelegate。当从显示中删除每个UITableViewCell时,您应该能够立即使用它来获取回调,因此如果您知道在特定索引路径上启动了删除动画,那么您可以将其用作通常知道动画已经结束的可靠方法。

(除此之外:我猜如果用户在动画期间将屏幕上的单元格滚动出来,那么你可能会得到假阳性,但是这样的事情将不太可能增加一个基本的防范,以防止持续的负面后果,而不是担心短暂的,例如,当中间删除对象滚动到屏幕上时,我最终显示一个空单元格,因为我已经将其从我的商店中删除了)

答案 1 :(得分:2)

我相信一种方法是实现UITableViewDataSource的方法tableView:commitEditingStyle:forRowAtIndexPath:并在其中执行延迟性能方法。

- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath {

    if (UITableViewCellEditingStyleDelete == editingStyle) {

        [self performSelector:@selector(delayedMethod) withObject:nil afterDelay:0.1];
    }
}

-(void)delayedMehtod {
    // Your code here...
}

它可能不像“完成”块那么漂亮,但我确信它会成功。

希望这有帮助!