iOS 8: 不带动画的UINavigationController弹出,然后再推入。

3
在我们的应用程序中,有许多地方需要快速弹出视图控制器而不带动画,然后再以动画形式推入新的视图控制器。我们会做类似这样的事情:
[navController popViewControllerAnimated:NO];
[navController pushViewController:newVC animated:YES];

在iOS8之前,这个代码可以正常工作并且动画效果会显示新的视图控制器从当前的视图控制器滑入,因为导航控制器首先没有动画地弹出。
现在在iOS8中,情况似乎已经改变了,顶部的视图控制器被弹出,底层的视图控制器闪烁了一下,然后新的视图控制器被推入。我从头开始创建了一个iOS8的Xcode项目并尝试了测试。请参见此GIF以查看演示。每次我们在分割视图的主侧面上点击其中一个按钮时,我们在分割视图的详细(右)侧面执行以上两行代码。请注意,在推入新视图控制器之前,灰色视图(导航控制器的根视图)会闪烁一瞬间。
我尝试搜索任何可能导致iOS8更改的原因,但似乎找不到任何相关文档。有人对可能导致这种更改的原因有任何想法吗?任何意见都将不胜感激!
另外,我尝试着修改代码,并发现使用以下代码:
NSMutableArray *viewControllers = [NSMutableArray arrayWithArray:navController.viewControllers];
[viewControllers removeLastObject];
[viewControllers addObject:newVC];
[navController setViewControllers:viewControllers animated:YES];

看起来问题已经解决了。然而,如果可能的话,我更希望不使用这种方法,因为我们的应用程序中有许多地方都使用了这个2行的弹出-推送组合,我更希望不必到处更改。

谢谢!


2
在我看来,iOS8 实际上做得很对,而你在 iOS8 之前看到的任何东西可能都不是有意为之。 - Mike
我发现即使我先执行push再执行pop,仍然会出现奇怪的动画效果。 - Chris
你找到这个问题的原因或解决方案了吗?请更新。 - Cemal Eker
我几周前向苹果提交了一个错误报告,但他们仍未回复。目前我发现的唯一解决方案是我上面提到的那个。 - baselq
1个回答

1

我想到了与你类似的解决方案,第一个是情境性的。

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

其次,您可以向UINavigationController添加一个类别,基本上实现您上面列出的代码。这将节省您在应用程序中到处更改它的时间。

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

如果苹果不修复/回应,我打算实施后者。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接