iOS 8:UINavigationController弹出没有动画然后推送

时间:2014-09-05 18:36:49

标签: ios objective-c uinavigationcontroller ios8

在我们的应用程序中,我们需要很多地方快速弹出一个没有动画的视图控制器,然后用动画推送一个新的。我们会做类似

的事情
[navController popViewControllerAnimated:NO];
[navController pushViewController:newVC animated:YES];

在iOS8之前,这个工作正常,动画显示新的视图控制器滑过当前的视图,因为导航控制器首次弹出而没有动画。

现在使用iOS8,这似乎已经改变了,现在发生的事情是顶视图控制器弹出,底层视图控制器闪烁一瞬间,然后新的视图控制器被推开。我从头开始为iOS8创建了一个Xcode项目,并尝试对此进行测试。 Please see this GIF用于演示它的外观。每次我们点击拆分视图主站侧的其中一个按钮时,我们会在拆分的细节(右侧)执行上面两行代码。请注意,灰色视图(导航控制器的根目录)会在按下新视图之前闪烁一小段时间。

我已经尝试搜索iOS8中可能发生变化的任何原因,但我似乎无法找到任何相关文档。任何人都对可能导致这种变化的想法有任何想法?任何意见都将非常感谢!

此外,我尝试使用代码并发现执行以下代码

NSMutableArray *viewControllers = [NSMutableArray arrayWithArray:navController.viewControllers];
[viewControllers removeLastObject];
[viewControllers addObject:newVC];
[navController setViewControllers:viewControllers animated:YES];

似乎解决了这个问题。但是,如果可能的话,我宁愿不使用它,因为我们的应用程序中有很多地方都使用这个2行pop-push组合,我宁愿不必在整个地方进行更改。

谢谢!

1 个答案:

答案 0 :(得分:1)

我想出了类似的解决方案,但首先是情境解决方案。

首先,你可以覆盖你正在操作的堆栈中的后退按钮以弹出到root(或任何你想成为root的控制器)。

其次,您可以向UINavigationController添加一个类别,基本上实现上面列出的代码。这样可以避免在应用程序中随处更改它。

-(UIViewController *)popPushViewController:(UIViewController *)controller animated:(BOOL)animated {
    NSMutableArray *viewControllers = [NSMutableArray arrayWithArray:self.viewControllers];
    [viewControllers removeLastObject];
    [viewControllers addObject:controller];
    [self setViewControllers:viewControllers animated:animated];
}

如果Apple没有解决它/做出响应,我打算实施后者。