【发布时间】:2014-09-22 15:23:33
【问题描述】:
自从在 iOS 8 上测试我的应用后,我发现一个解决视图控制器初始化和呈现的工作非常缓慢。
我曾经在 iOS 6 和 7 上使用过类似的代码:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
....
[self.window setRootViewController:_rootController];
[self.window makeKeyAndVisible];
// Conditions
if (#first launch condition#) {
// quite small controller containing Welcome showcase
WelcomeViewController *w = ....
[_rootViewController presentViewController:w animated:NO];
}
else if (#last opened item condition#) {
// pretty big container, root view controller contains
// a grid view which opens Item detail container the same way
ItemDetailController *item = ....
[_rootViewController presentViewController:item animated:NO];
}
}
这在 iOS 8 中变成了一个非常缓慢的地狱。根视图控制器现在显示为 0.5-1 秒,然后立即用呈现的视图重绘屏幕。此外,演示的缓慢开始导致Unbalanced calls to begin/end appearance transitions _rootViewController 警告。
最初的快速提示是通过调用另一个函数来移动这两个条件,并以零延迟调用它,以便在下一个主运行循环中处理它:
[self performSelector:@selector(postAppFinishedPresentation) withObject:nil afterDelay:0];
或类似的东西。这解决了不平衡的调用问题,但视觉差距(rootviewcontroller、gap、presented one)变得(显然)更大。
当您将通常称为以下内容时,演示的缓慢性也很明显:
// Example: Delegate caught finished Sign In dialog,
// dismiss it and instantly switch to Profile controller
-(void)signInViewControllerDidFinishedSuccessfully
{
[self dismissViewControllerAnimated:NO completion:^{
UserProfileViewController *userProfile = ...
[self presentViewController:userProfile animated:NO];
}];
}
这应该是一段完全公平的代码,它曾经在 iOS 7 上执行直接转换,而无需可见的父视图控制器轻弹。现在,同样的事情 - 过渡期间的父轻弹,即使它都在没有动画的情况下处理。
有人会遇到这个问题吗?有什么解决办法吗?我很想解决这个问题,而无需使用UIWindows 为我需要完美传输的每一件事做一些搞笑的魔法。
【问题讨论】:
-
我也遇到了这个问题,但还没有找到解决办法。
-
您找到解决方案了吗?
-
也处理相同类型的问题。还没有解决办法。在我的代码中,iOS 7 运行良好,但 iOS 8 在关闭/呈现 viewController 组合之间有一个可怕的延迟。尝试将两个调用放在同一个动画块中无济于事。在没有动画的同一个调用中尝试了两者,仍然没有。 iOS 8 有很多隐藏的礼物......
-
你们找到解决这个问题的办法了吗?
-
这是 iOS8 的 bug 吗?
标签: ios uiviewcontroller presentviewcontroller