在应用程序进入后台之前执行操作

时间:2013-08-02 10:10:40

标签: ios objective-c

如果我的应用程序进入后台,我想关闭一个模态视图控制器。我假设将代码放在applicationDidEnterBackground中它可以解决问题,但不幸的是,直到下次应用程序进入前台时才会将命令应用于屏幕。一瞬间,您可以看到原始模态视图控制器,然后消失。

是否有像applicationWillEnterBackground这样的方法?或者有没有办法在应用程序进入后台之前更新UI。

目前我有这段代码:

- (void)applicationDidEnterBackground:(UIApplication *)application {   

    NSLog(@"Application entered background state.");

    [splitVO dismissViewControllerAnimated:true completion:nil];
}

5 个答案:

答案 0 :(得分:4)

尝试将animated参数设置为NO

答案 1 :(得分:0)

您的委托的applicationDidEnterBackground:方法有大约5秒的时间来完成任何任务并返回。实际上,这种方法应该尽快返回。如果方法在时间用完之前没有返回,则应用程序将被终止并从内存中清除。如果仍需要更多时间来执行任务,请调用beginBackgroundTaskWithExpirationHandler:方法来请求后台执行时间,然后在辅助线程中启动任何长时间运行的任务。无论您是否启动任何后台任务,applicationDidEnterBackground:方法仍必须在5秒内退出。

基本上,在将UIViewController的视图添加到应用程序的UIWindow heirarchy之后,会调用viewDidAppear。后台然后恢复应用程序不会在这方面改变您的视图,因此不会调用viewDidAppear - 它是正确的行为,而不是错误。查看UIViewController的API文档。

答案 2 :(得分:0)

尝试启用后台任务标识符

- (void)applicationDidEnterBackground:(UIApplication *)application {   

    NSLog(@"Application entered background state.");


    UIBackgroundTaskIdentifier bgTask;

    UIApplication *app = [UIApplication sharedApplication];

    bgTask = [app beginBackgroundTaskWithExpirationHandler:^{
        [app endBackgroundTask:bgTask];
        bgTask = UIBackgroundTaskInvalid;
    }];
    [splitVO dismissViewControllerAnimated:true completion:nil];
}

答案 3 :(得分:0)

订阅通知UIApplicationWillResignActiveNotification。作为对此的回复,您可以更新您的用户界面。

答案 4 :(得分:0)

您可以尝试添加使UI更改为以下应用程序委托方法的代码。

-(void)applicationWillResignActive:(UIApplication *)application{

}

当应用程序仍然在屏幕上但是它将转换到非活动状态然后它将在短暂的时间段内进入后台状态时,将调用此应用程序委托方法。 applicationDidEnterBackground方法将在上述方法之后执行。因此,这是进行UI更改的正确位置。在将应用程序从后台移回到前台时,可以使用以下方法恢复此处所做的更改,该方法将在应用程序在屏幕上显示之前调用。

-(void)applicationWillEnterForeground:(UIApplication *)application{

}