从applicationDidEnterBackground中解除视图并显示一个新视图

时间:2014-02-17 12:02:01

标签: ios objective-c cocoa-touch

我有一个应用程序,当用户启动应用程序或从后台重新打开它时,它会显示自己的密码条目。当用户从后台打开它时,应该没有真正应用程序的“闪存”,换句话说,在用户重新打开应用程序之前,安全屏幕需要完全加载。

我对大多数屏幕都设置得很好。

在一种情况下,用户可以将调用segue的应用程序从标签栏控制器旋转到水平视图控制器。在那种情况下,我遇到了一些问题。如果我没有弹出旋转的屏幕,那么输入屏幕会水平显示,即使用户以纵向方式重新打开应用程序..

如果我用动画解雇它,那么在应用重启之前锁定屏幕才会开始加载,因此你会得到一些内容。

如果我在没有动画的情况下将其关闭,那么锁定屏幕仍会水平显示。

以下是来自applicationDidEnterBackground

的内容
    TabBarController *tbc = (TabBarController*)self.window.rootViewController;        

    void (^openPasscode)() = ^void() {
        KVPasscodeViewController *passcodeController = [[KVPasscodeViewController alloc] init];
        passcodeController.delegate = self;
        UINavigationController *passcodeNavigationController = [[UINavigationController alloc] initWithRootViewController:passcodeController];

        // Change animated to YES and the new view isn't loaded until after the app restarts
        [self.window.rootViewController presentViewController:passcodeNavigationController animated:NO completion:nil];

    };

    if (tbc.isShowingLandscapeView) {
        [self.window.rootViewController dismissViewControllerAnimated:NO completion:openPasscode];
    } else {
        openPasscode();
    }

3 个答案:

答案 0 :(得分:1)

另一种可能性......因为applicationDidEnterBackground在主线程上被调用,所以你在那里做的任何事情都会在下一次通过主运行循环之前不可见(直到下一次才发生)应用程序返回到前台 - 这就是为什么在安全视图显示在其顶部之前您看到主屏幕闪烁的原因。)

重新排列视图后,如果在离开之前强制应用程序再次绕过主运行循环,该怎么办?您可以尝试在applicationDidEnterBackground结束前添加此内容:

[[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode beforeDate:[NSDate date]];

这只是一个猜测 - 我没有尝试过,但我希望它能为你提供另一个探索方向。

答案 1 :(得分:1)

尝试子类化包含密码视图控制器的UINavigationController并实现这些方法(来自UIViewController.h):

- (BOOL)shouldAutorotate {
    return YES; // when app launched while device in landscape. it needs to rotate to portrait.
}

- (NSUInteger)supportedInterfaceOrientations {
    return UIInterfaceOrientationMaskPortrait;
}

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
    return (UIInterfaceOrientationPortrait == interfaceOrientation);
}

- (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation {
    return UIInterfaceOrientationPortrait;
}

答案 2 :(得分:0)

如果您在applicationWillEnterForeground而不是applicationDidEnterBackground中显示密码视图会怎样?

我的想法是,当应用程序恢复时,它会在主应用程序屏幕出现之前显示你的锁屏视图控制器 - 这样可以避免主视图的任何“闪烁”,并且任何旋转变化都会在之前解决视图出现。