【问题标题】:Changing UIView when applicationWillEnterForeground fires当 applicationWillEnterForeground 触发时更改 UIView
【发布时间】:2011-09-27 12:34:18
【问题描述】:

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

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

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

我尝试注册一个 NSNotification,但它触发得很晚,并且视图在 NSNotification 方法运行之前出现在用户面前。

【问题讨论】:

  • 这是两个问题吗? 1.) 如何在应用程序后台运行(辞职)时获取当前视图并存储它,以及 2.) 当用户从后台恢复应用程序时,如何在显示之前更新所述视图?
  • 您是否尝试过调用[view setNeedsDisplay][view setNeedsLayout] 来刷新视图(从而避免切换到不同的视图并再次返回以获得所需的效果)?
  • @Sam,是的,我尝试了这两种方法。视图仍处于加载状态,因此 UIView 在这些调用触发所需更改之前已经显示。
  • 您是否考虑过在applicationDidEnterBackground 期间更改视图?那么你就不用担心在applicationWillEnterForeground 中显示它了。这似乎对我有用。你到底在做什么?更改图像、添加子视图、应用转换?我想尝试复制您看到的不良行为。
  • @Sam,问题是,他们可以退出应用程序以更改应用程序设置,然后返回应用程序。我希望这些设置在它们回到应用程序后立即更改。

标签: ios uiview


【解决方案1】:

若要在用户为您的应用设置背景时获取当前显示的视图,请使用您的 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看到它。要让您的应用在后台(暂停)时退出,请将密钥 "Application does not run in background" - raw key: UIApplicationExitsOnSuspend 设置为 YES

这样做可以保证用户以他们在设置中配置的方式看到您的应用,而不会看到它过去的样子。很抱歉,我找不到更好的方法来做到这一点。 :(

替代方案 2

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

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

【讨论】:

  • 我意识到这可能无法完全回答您的问题,但我认为这应该有助于进行更好的讨论。您还需要哪些具体帮助?什么是/不工作?我不知道您是否尝试过像我上面的代码这样的简单示例,我已经看到它可以工作,现在正在处理更复杂的问题,但由于某种原因无法正常工作。如果我有足够的细节可以查看,我想帮助您完成它。
  • 所以更详细一点,就是根控制器是一个UITabViewController,然后每个tab都是一个NavController或者UIView。我希望能够在当前选定的选项卡中捕获当前 UIView。如果选择了另一个选项卡,则设置将更改,然后它们会返回到原始选项卡。我还没有尝试你的例子,但也许你的答案会随着新信息的变化而改变。
  • 让我知道是否有任何一种替代解决方案适合您。不幸的是,在恢复应用程序时似乎无法在视图显示之前更新视图。
  • 如果不希望终止,是否可以在applicationWillResignActive: 中显示空白屏幕,以便操作系统将其作为“最后状态”屏幕截图?当您重新进入应用程序时可能看起来有点不和谐,但可能不如由于偏好更改而突然切换布局。
  • @jrturton 是的,你可以这样做。我尝试在 applicationDidEnterBackground: 中进行 UI 更改,当应用程序恢复时我立即看到了它。所以,是的,那肯定行得通。
【解决方案2】:

我猜你猜错了。

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

所以,当您获得 applicationWillEnterForeground: 时进行更改,然后将从您要恢复的位置获取快照。

【讨论】:

    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

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

      【讨论】:

        猜你喜欢
        • 2014-06-24
        • 2021-08-08
        • 2012-10-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-09-04
        • 2011-08-31
        • 1970-01-01
        相关资源
        最近更新 更多