0

我有一个 UINavigationController,我在其上推送一个“加载屏幕”UIViewController,同时异步连接到服务器。带有滑动效果的推动是隐含的动画。如果连接时发生错误,我会弹出加载屏幕控制器(再次动画)并向用户显示警报。

如果我在动画完成后弹出视图控制器,一切都很好,但是如果动画尚未完成,就会发生奇怪的事情。通常加载屏幕视图会保留在屏幕上,即使它已从导航控制器堆栈中弹出。我很确定问题与正在进行的动画有关。例如,这个人为的代码片段总是让我在屏幕上看到 secondController 的视图:

[navController pushViewController: secondController animated: YES];
[navController popToRootViewControllerAnimated: YES];
NSAssert([delegate.navigationController.viewControllers count] == 1, @"oops");

我当前的解决方法是向导航控制器注册一个委托并实现 navigationController:didShowViewController:animated: 方法。只有当我知道第一个推送动画完成时,我才会弹出加载屏幕控制器。但是我宁愿早点结束动画。

对于导航控制器视图的所有子视图,我尝试在图层树中的所有图层上调用 removeAllAnimations。虽然这种方法提前结束了动画,但它仍然经常在弹出后仍然显示加载屏幕视图。所以基本上有一个正确的方法来提前结束动画,还是我应该坚持我的工作?

4

2 回答 2

0

很难知道为什么要在推送后立即弹出到根视图控制器,但是当我不得不做这种事情时,我让被推送的视图控制器确定它是否需要弹出。因此,在您的 secondController 的 -viewDidLoad 中,确定您弹出到根视图的条件是否为真。如果是,则通过调用从那里弹出

[[self navigationController] popViewControllerAnimated:YES];

此外,这并不是说这会解决您的问题,但您可能需要考虑使用 -presentModalViewController 推送“加载屏幕”:

- (void)presentModalViewController:(UIViewController *)modalViewController animated:(BOOL)animated

它是流行的:

- (void)dismissModalViewControllerAnimated:(BOOL)animated
于 2009-08-08T21:27:50.277 回答
0

完全未经测试,但是您是否尝试过从视图控制器视图的核心动画层中删除所有动画?

[[[secondController view] layer] removeAllAnimations];
于 2009-08-10T08:13:13.883 回答