为啥后台和重新打开应用程序不调用 viewDidAppear?

Posted

技术标签:

【中文标题】为啥后台和重新打开应用程序不调用 viewDidAppear?【英文标题】:Why doesn't backgrounding and re-opening an app call viewDidAppear?为什么后台和重新打开应用程序不调用 viewDidAppear? 【发布时间】:2013-01-09 06:11:22 【问题描述】:

我有 2 个视图控制器,vc1 和 vc2。当我想加载 vc2 时,从 vc1 调用模态 segue。假设我在显示 vc2 时将应用程序置于后台。当应用程序重新打开到停止的视图时,为什么不调用 viewDidAppear?每次出现 vc2 时,我还能如何检测到?

【问题讨论】:

viewWillAppear: 在应用返回前台时不会被调用,因为视图控制器已经显示。 【参考方案1】:

您可以在 VC2 中注册 UIApplicationDidBecomeActiveNotification 并从那里调用 viewDidAppear。在 VC2 的 viewDidLoad 中执行此操作:

[[NSNotificationCenter defaultCenter] addObserver:self
                     selector:@selector(somethingThatWillCallViewDidAppear:)
                       name:UIApplicationDidBecomeActiveNotification 
                                  object:nil];

正如 rmaddy 下面所说,确保在 dealloc 或 viewDidUnload 中删除观察者。

【讨论】:

另外你忘了在 UIApplicationDidBecomeActiveNotification 之前添加“name:” 还要确保在 dealloc 方法中删除观察者。另请记住,您不应自己致电viewWillAppear:。从 viewWillAppear: 重构您想从 viewWillAppear: 和通知处理程序调用的代码。 根据您的实际需要,注册UIApplicationWillEnterForegroundNotification 可能更合适。 @rmaddy 如果我使用 ARC,我不必移除观察者对吧? ARC 与此无关。如果添加观察者,则必须删除观察者。如果您不这样做,如果向已释放的观察者发送通知,您的应用程序可能会崩溃。来自NSNotificationCenter addObserver:selector:name:object: 的文档 - 确保在 notificationObserver 或 addObserver:selector:name:object: 中指定的任何对象被释放之前调用 removeObserver: 或 removeObserver:name:object:。

以上是关于为啥后台和重新打开应用程序不调用 viewDidAppear?的主要内容,如果未能解决你的问题,请参考以下文章

为啥我得手机后台应用每次都要重新进?

为啥我的particleIllusion 一双击打开就立即关闭了?????谁遇见过这种情况??急急急~~

[Firebase 消息传递]:应用程序在后台时不调用后台消息处理程序方法?

为啥不直接使用js与后台交互,而使用jsp等技术?

为啥网站后台登录总是过不长时间就自动退出重新登录

重新加载表视图数据并取消选择单元格