应用程序进入前台后 viewDidAppear 不再触发

Posted

技术标签:

【中文标题】应用程序进入前台后 viewDidAppear 不再触发【英文标题】:viewDidAppear not firing ever again after app enters foreground 【发布时间】:2011-03-24 09:51:59 【问题描述】:

我在我的 iPhone 应用程序代码中发现了一个问题,即 viewDidAppear 方法并不总是触发。当您启动应用程序时,事件会按预期触发。但是,如果我使用能够进行多任务处理的手机关闭应用程序并重新打开。我的 viewDidAppear 事件不再触发。

我的视图是从 Nibs 加载的,我使用 viewDidUnload 来清理(释放并清除所有出口)。我的视图嵌套在侧边和标签栏中,然后是导航控制器。当笔尖重新加载时,我看起来事件没有正确连接。关于我做错了什么/缺少什么以及如何解决这个问题的任何想法?

提前致谢。

UPDATE 我并不是说当应用程序第一次进入前台时没有触发该事件。我的意思是该事件永远不会再次触发。即使在选项卡之间切换或在导航视图中移动时也是如此。

例子:

- (void)viewDidAppear:(BOOL)animated 
   [super viewDidAppear:animated];
   NSLog(@"viewDidAppear called");

此代码放置在两个视图中,每个视图位于不同的选项卡上。每次我在选项卡之间切换时,“viewDidAppear called”都会写入日志。当我关闭并重新打开应用程序并在选项卡之间切换时,这种情况不再发生。其他按钮事件正常触发。

【问题讨论】:

其他 NSLogs 是否还在出现?我的意思是,这不是所有 NSLog 的问题,只是在您后台恢复并恢复后什么都做不了? 您是否在 UIViewControllers 方面对您的 UI 设置进行了异常或复杂的操作?例如,您是否在嵌套 Apple 建议不要嵌套的东西? 【参考方案1】:

顺便说一句,viewDidUnload 方法的名字真的很糟糕——它不是 viewDidLoad 的“对立面”,它仅在内存不足的情况下调用,并且该控制器的视图由于没有被卸载而被卸载当时可见。

(原创,不是很相关的答案:)

请看我对这个类似问题的回答:

Why does viewWillAppear not get called when an app comes back from the background?

基本上,viewDidAppear 在你的 UIViewController 的视图被添加到应用程序的 UIWindow 层次结构之后被调用。后台处理然后恢复应用程序并不会改变您在这方面的看法,因此不会调用 viewDidAppear - 这是正确的行为,而不是错误。查看 UIViewController 的 API 文档。

【讨论】:

:) 它再也不会被调用。即使我在选项卡、推送和弹出视图之间切换。一旦我最小化并重新打开应用程序,此事件就不会再次触发。 确保你所有的 viewController 都在他们的 viewDidAppear 方法中调用了 [super viewDidAppear],否则消息可能会丢失。【参考方案2】:

找到了。

虽然我对编程并不陌生,但我对 iPhone 开发并不陌生。在研究这个问题时,我发现不建议手动调用viewWillAppearviewWillDisappear 方法。

如果显示,我的 viewWillDisappear 方法会退出任何键盘,当我的应用程序进入后台时,它会加载一个启动屏幕,以便在应用程序重新进入前台时准备好(我需要做一些逻辑来确定用户的操作重新启动应用程序时显示,我可以在启动屏幕下执行此操作)。

由于在应用程序进入后台时不会调用viewWillDisappear,以确保在我的初始屏幕上没有出现键盘,我在applicationDidEnterBackground 方法中调用了viewWillDisapper。我想这也会取消注册我的活动。

通过将viewWillAppear 添加到我的applicationDidEnterForeground 方法中,我的事件再次开始触发。吸取的教训,我将对其进行重构,因此我不会手动调用这些事件。

感谢您的帮助。

【讨论】:

很高兴您对它进行了排序。你应该接受你自己的答案 - 如果你找到自己问题的答案,这是允许的,你应该接受。 我强烈推荐这个线程的解决方案,而不是做这样的特技:***.com/questions/15864364/…

以上是关于应用程序进入前台后 viewDidAppear 不再触发的主要内容,如果未能解决你的问题,请参考以下文章

(Swift 3)我们如何在 ViewDidAppear() 之前进入单元格?我想在用户进入此控制器后立即显示单元格

应用程序进入前台后停止调用 setKeepAliveTimeout 处理程序?

单击推送通知后,当应用程序进入前台时如何显示自定义对话框

iOS应用程序从后台到前台时进入仪表板?

应用程序将进入后台并进入前台遇到黑屏

何时实际调用 viewDidLoad / viewDidAppear? [复制]