viewcontroller 生命周期事件应该在应用程序启动到后台时调用吗?

Are viewcontroller llfecycle events suppose to be called when app is launched into background?

我一直都知道window?.makeKeyAndVisible()要在didFinishLaunching

内完成

但我还认为,在应用程序被置于前台之前,不会调用根 viewcontroller 的生命周期事件。是不是思路不对?

即通过调用 makeKeyAndVisible——即使应用程序仅在后台启动,我也会看到它被调用的 viewDidLoadviewWillAppearviewDidAppear 方法。

这是预期的吗?!

是的,有点。 “出现”并不意味着“用户即将看到它”。这意味着“正在组装视图控制器层次结构,并且此视图控制器的视图正在进入层次结构”。视图控制器调用 应该 稳定,无论我们是在前台还是后台启动。

(要看到这一点,想象一下相反的情况;一切都会崩溃!启动就是启动,视图控制器就是视图控制器;你必须获得预期的事件,否则应用程序将休息。)


但让我在这里发出更强烈的警告,因为我有肥皂盒。不要对两个不同的 生命周期如何相互交错做出任何 假设。 app 生命周期是稳定的,view controller 生命周期是稳定的,但是它们相互交错的方式因主要系统而异 从架构到架构(我所说的“架构”是指您是否使用导航控制器等很重要)。

我对此有很多了解。当我第一次开始编程时 iOS 我发现这是交错的顺序:

  • application(_:didFinishLaunchingWithOptions:)
  • viewDidLoad
  • viewWillAppear(_:)
  • applicationDidBecomeActive(_:)
  • viewDidAppear(_:)

根据该顺序,我通常使用根视图控制器的 viewDidAppear(_:) 来注册 UIApplication.didBecomeActiveNotification,以便收到 后续 激活的通知应用

几年来效果很好。但是 iOS 8 带来了一个重大变化:app delegate 现在在 根视图控制器收到 viewDidAppear(_:) 之后收到 applicationDidBecomeActive(_:) ,像这样:

  • application(_:didFinishLaunchingWithOptions:)
  • viewDidLoad
  • viewWillAppear(_:)
  • viewDidAppear(_:)
  • applicationDidBecomeActive(_:)

这对我的许多应用程序来说都是一场灾难,因为我刚刚在 viewDidAppear(_:) 注册的通知 立即

然后,在 iOS 9 中,顺序恢复到 iOS 7 和之前的状态——再次让我的应用程序陷入混乱。然后,在 iOS 11 中,顺序恢复到 iOS 8!

中的顺序

教义是你不应该像我一样依赖不同对象的生命周期事件之间的时间关系。我所做的 总是 错误。