触发applicationWillEnterForeground时更改UIView

时间:2011-09-27 12:34:18

标签: ios uiview

我正在寻找一种方法来获取当用户将应用程序发送到后台时向用户显示的当前视图。

情况是我在我的设置包中提供了选项,以便在触发applicationWillEnterForeground时我希望生效。

有人建议如何解决这个问题吗?

我尝试注册一个NSNotification,但它会触发,并且在NSNotification方法运行之前,用户会看到该视图。

4 个答案:

答案 0 :(得分:7)

要获取当用户为您的应用添加背景时显示的当前视图,请使用AppDelegate的applicationDidEnterBackground方法。

- (void)applicationDidEnterBackground:(UIApplication *)application
{
    // Get current view...  
    // (get from UITabbarController or whatever logic you like)

    // For this code sample, just grab first UIView under the main window
    UIView *myView = [self.window.subviews objectAtIndex:0];
}

要在显示之前更改视图,请使用AppDelegate的applicationWillEnterForeground方法,如下所示:

- (void)applicationWillEnterForeground:(UIApplication *)application
{
    UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(50, 50, 80, 80)];
    label.backgroundColor = [UIColor whiteColor];
    label.text = @"yo";

    [self.myLastView addSubview:label];
}

我意识到你在你的问题中提到了applicationWillEnterForeground。您可以更具体地了解您正在尝试做什么或可能包含代码吗? 我实际上尝试了上面的代码和视图更新(我在视图上方看到标签"yo"

我的最后一个建议是尝试调用[view setNeedsDisplay][view setNeedsLayout]来强制UIView重绘自己。 (注意 - 问题不是uiview更改没有显示,问题是它们出现在旧视图显示之后。看起来在暂停应用程序之前拍摄了截图,此屏幕截图最初显示在恢复应用程序性能时)

修改

以上代码是用户所看到的一个很好的例子。标签"yo"显示,但仅在视图恢复后显示。我会看看能不能解决这个问题并重新发布。

编辑2

就我所知,恢复暂停的应用程序似乎会显示应用程序上次已知状态的捕获屏幕截图。我试图找到这种效果的文档,但我找不到它。

替代解决方案1 ​​

当用户点击主页按钮时,您的应用会退出。

如果您将应用的状态保存在applicationWillResignActive:applicationWillTerminate:中,则只需恢复该状态(导航到最后一次正确的标签用户),然后在appDidFinishLaunchingWithOptions:中即可在用户看到UI之前更新UI。要在背景(暂停)时让您的应用退出,请将 "Application does not run in background" - raw key: UIApplicationExitsOnSuspend 键设置为

这样做可以保证用户能够按照他们在设置中配置应用的方式看到您的应用,而不会看到它过去看起来的闪烁。对不起,我找不到更好的方法来做到这一点。 :(

替代解决方案2

在您的应用内显示您的设置。

这显然需要进行设计更改,但是越来越多的应用程序在应用程序中显示设置。受欢迎的第三方库是 In App Settings Kit 。这使您可以通过bundle / plist文件配置设置,就像使用全局应用程序设置一样。它的外观和行为就像全局设置一样。这样您就可以完全控制应用程序中的任何行为。

答案 1 :(得分:0)

我猜你已经倒退了。

系统可以拍摄当前屏幕的快照,并在您的应用程序恢复到前台时显示此信息。在您有机会在applicationWillEnterForeground:time更改它之前,这个快照可能会显示旧外观。

因此,在获得applicationWillEnterForeground:时进行更改,然后快照将从您要恢复的内容中获取。

答案 2 :(得分:0)

在每个viewDidLoad中,您始终可以发布通知,请参阅NSNotification Class Reference,您可以在NSUserDefaults中存储对视图的引用,然后在用户时执行您需要执行的操作返回 applicationWillEnterForeground:

答案 3 :(得分:0)

以防有人遇到同样的问题:
似乎Apple在UIApplication上的iOS7中实现了一个新属性,这会阻止在重新进入前景时使用以前拍摄的快照 - ignoreSnapshotOnNextApplicationLaunch