检查完成的导航控制器动画

时间:2012-03-14 18:03:54

标签: uitableview ios5 pushviewcontroller nsindexpath

我现在知道如果您将视图控制器推送到带有动画的导航控制器上,您必须等到该动画完成后再按下另一个视图控制器,否则会收到警告并可能出现意外结果。

如何检查导航控制器动画是否已完成以避免此问题?

由于

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:    (NSIndexPath *)indexPath
{ 
    // ...


    //Make sure animation has completed before sending message below


[[self navigationController] pushViewController:detailsViewController animated:NO];

//...

}

2 个答案:

答案 0 :(得分:3)

如果你想要一次推送一个VC(在许多VC上向右移动),你可以在控制器类中实现UINavigationControllerDelegate(app delegate会这样做),将它/你自己分配给{ {1}}。每次推送后,UINavigationController都会调用self.navigationController.delegate

答案 1 :(得分:-1)

我使用了另一种对我来说效果很好的方法。只需将pushViewController:animated:调用包含在animations:的{​​{1}}参数中即可。放置完成时需要运行的任何内容,例如在[UIView animateWithDuration:animation:completion中推送我正在做的后续控制器。

在我的例子中,我在一个方法中运行整个事情,该方法将一个数组(NSMutableArray)与控制器列表作为参数推送。在completion:块中,该方法弹出数组中的第一个元素(completion:objectAtIndex:0),并使用数组的其余部分调用自身。

这是一个有趣的continuation-passing-style实现:) 有一点需要注意的是,在动画结束时,新导航控制器的内容可能无法完全加载,因此只有当您的推送独立于该内容时,此方法才可靠。