当应用程序在后台运行时,iOS 7.x 上的 UINavigationController 推送/弹出错误

Posted

技术标签:

【中文标题】当应用程序在后台运行时,iOS 7.x 上的 UINavigationController 推送/弹出错误【英文标题】:UINavigationController push / pop bug on iOS 7.x when app is running in the background 【发布时间】:2014-03-24 09:41:59 【问题描述】:

我已将 UINavigationController 设置为我的 mainWindow 的 rootViewController。

我从代码中推送和弹出视图控制器(因此推送和弹出不会由用户交互触发)。

当我在应用程序处于前台时执行此操作时,一切正常。

但是当我在后台运行应用程序时执行此操作时,不会显示正确的 ViewController。

这个问题只能在 ios 7.x 上重现。

可以在此链接下找到示例项目:https://www.dropbox.com/sh/pmxnpgtrjxwehs7/_l3NW4xllf

要重现此问题,只需将应用程序置于后台并等待 12 秒,然后将应用程序返回到前台:当您使用 UINavigationBar 的后退按钮导航时,不会显示 navigationController 的 rootView(应该如此):背景是仍然是绿色,而不是黄色(navigationController 的 rootViewController 的背景是黄色的)。

当应用程序处于前台时,点击带有“aaaaa”标签的按钮会执行相同的导航,但完成后,GUI 处于正确状态。

简而言之: 这在应用程序在前台时有效,但在应用程序在后台时无效:

dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(3 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^
    NSLog(@"pushViewController!");
    [self pushViewController:[[BViewController alloc] init] animated:YES];

    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(3 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^
        [self popToRootViewControllerAnimated:YES];

        dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(3 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^
            [self pushViewController:[[BViewController alloc] init] animated:YES];
        );
    );
);

你知道如何解决这个问题吗?

提前致谢!

【问题讨论】:

请贴一些代码。 在后台执行推送/弹出操作不是一个好主意。应用进入前台时为什么不做呢? 我刚刚添加了一个示例项目的链接,该示例项目可以从 Dropbox 以 zip 的形式下载,并且我已经突出显示了可用于重现该错误的代码中最重要的部分。 我已经尝试在应用程序处于后台时实现排队导航,并在应用程序返回前台时执行它们,但由于某种原因问题仍然可以重现......我会更新带有该修复的示例代码... 只是一个简单的问题,为什么你在 3 秒后推/弹出/推同一个控制器?您确定没有其他方法可以做同样的事情吗? 【参考方案1】:

我找到了一个解决方案:我使用此处发布的代码实现了相同的导航动画:***.com/questions/9480458/change-animation-transition。使用该代码无法重现该问题!

【讨论】:

以上是关于当应用程序在后台运行时,iOS 7.x 上的 UINavigationController 推送/弹出错误的主要内容,如果未能解决你的问题,请参考以下文章

在 iOS 中定期在后台线程中运行任务

iOS 8 推送通知操作按钮 - 当应用程序在后台时,handleActionWithIdentifier 中的代码并不总是运行

如何在 iOS 后台运行服务以接收本地通知?

在 iOS 上,当应用程序进入后台时 UnityWebRequest 下载停止

当应用程序在后台运行时,iOS 会显示 UIAlert

IOS;当应用程序未运行或在后台时,推送通知不起作用