我现在知道如果您将视图控制器推送到带有动画的导航控制器上,您必须等到该动画完成后再按下另一个视图控制器,否则会收到警告并可能出现意外结果。
如何检查导航控制器动画是否已完成以避免此问题?
由于
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath: (NSIndexPath *)indexPath
{
// ...
//Make sure animation has completed before sending message below
[[self navigationController] pushViewController:detailsViewController animated:NO];
//...
}
答案 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实现:) 有一点需要注意的是,在动画结束时,新导航控制器的内容可能无法完全加载,因此只有当您的推送独立于该内容时,此方法才可靠。