设置keyWindow rootViewController在iOS8中不起作用

时间:2015-03-04 18:36:19

标签: ios objective-c ios8 uistoryboard uiapplication

在我的应用中,我需要用户登录和注销。当我希望用户注销时,我会删除他们的凭据,然后:

ZSSLogin *login = [self.storyboard instantiateViewControllerWithIdentifier:@"ZSSLogin"];
[[UIApplication sharedApplication].keyWindow setRootViewController:[[UINavigationController alloc] initWithRootViewController:login]];

假设用登录rootViewController替换当前viewController(tabBarController)。

在iOS7上,这可以正常工作。但是,在iOS8中,它将显示登录VC一瞬间,但然后返回到tabBarController,就像没有发生任何事情一样。

有关正在发生的事情的任何想法?

3 个答案:

答案 0 :(得分:3)

我有完全相同的问题,登录VC会暂时显示,然后返回我的SplitViewController,只有iOS8,iOS7才能正常工作。

在我的场景中,这只发生在我在注销之前提交AlertView时,如果我直接更改rootViewController而没有AlertView它工作正常。

所以我用这个简单的解决方法修复了它:

- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex {
...

    // Added a delay to avoid an iOS8 bug, where setting rootViewControler doesn't work after dismissing an AlertView. (For some reason dispatch_after isn't working here)
    [self performSelector:@selector(logout) withObject:nil afterDelay:0.5];
...

我的猜测是在iOS8中,OS使用Window或rootViewController来设置和删除AlertView,存储对rootViewController的引用,然后在解除AlertView后将rootViewController设置为该引用。因此,如果您在操作系统将其设置回来之前更改rootViewController,它将替换您的更改。如果等待半秒直到操作系统完成对rootViewController的更改,问题就解决了。当然,这是一个假设。

答案 1 :(得分:2)

我也遇到了这个问题。这是AlertView的错误。您可以使用AlertView的另一个名为alertView:didDismissWithButtonIndex:的委托方法。在此方法中,请调用Setting RootViewController

- (void)alertView:(UIAlertView *)alertView didDismissWithButtonIndex:(NSInteger)buttonIndex
{
    if(buttonIndex == 0){
        // change Application.keyWindow.rootViewController
    }
}

答案 2 :(得分:0)

实际上这是一个与iOS 8相关的问题。在iOS 8中,他们将在设置窗口的rootViewController属性后保留旧视图层次结构。所以我的解决方案是在设置新视图之前删除子视图rootviewcontroller

Apple文档还说,“根视图控制器提供窗口的内容视图。将视图控制器分配给此属性(以编程方式或使用Interface Builder)将视图控制器的视图安装为窗口的内容视图。该窗口具有现有的视图层次结构,旧视图在安装新视图之前被删除。“

for (UIView * subView in self.window.rootViewController.view.subviews) {
    [subView removeFromSuperview];
}