繁体   English   中英

设置keyWindow rootViewController在iOS8中不起作用

[英]Setting the keyWindow rootViewController not working in iOS8

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

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

假设用登录viewController替换当前的rootViewControllerviewController

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

关于发生了什么的任何想法?

我有完全相同的问题,登录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的更改,问题就解决了。 当然,这是一个假设。

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

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM