【问题标题】: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: 在应用返回前台时不会被调用,因为视图控制器已经显示。

标签: ios objective-c uiviewcontroller


【解决方案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:。
猜你喜欢
  • 2013-03-29
  • 2019-11-01
  • 1970-01-01
  • 2011-04-08
  • 1970-01-01
  • 1970-01-01
  • 2015-02-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多