在我的应用中,我需要用户登录和注销。当我希望用户注销时,我会删除他们的凭据,然后:
ZSSLogin *login = [self.storyboard instantiateViewControllerWithIdentifier:@"ZSSLogin"];
[[UIApplication sharedApplication].keyWindow setRootViewController:[[UINavigationController alloc] initWithRootViewController:login]];
假设用登录rootViewController
替换当前viewController
(tabBarController)。
在iOS7上,这可以正常工作。但是,在iOS8中,它将显示登录VC一瞬间,但然后返回到tabBarController,就像没有发生任何事情一样。
有关正在发生的事情的任何想法?
答案 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];
}