为啥后台和重新打开应用程序不调用 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 一双击打开就立即关闭了?????谁遇见过这种情况??急急急~~