我一直都知道那window?.makeKeyAndVisible()
是在didFinishLaunching
但我也认为在应用程序被前台显示之前,不会调用根视图控制器的生命周期事件。想法不正确吗?
即通过调用makeKeyAndVisible
- 即使应用程序仅在后台启动,我也看到它的viewDidLoad
,viewWillAppear
和viewDidAppear
方法被调用。
这是预期的吗?!
我一直都知道那window?.makeKeyAndVisible()
是在didFinishLaunching
但我也认为在应用程序被前台显示之前,不会调用根视图控制器的生命周期事件。想法不正确吗?
即通过调用makeKeyAndVisible
- 即使应用程序仅在后台启动,我也看到它的viewDidLoad
,viewWillAppear
和viewDidAppear
方法被调用。
这是预期的吗?!
是的,有点像。“出现”并不意味着“用户即将看到它”。这意味着“正在组装视图控制器层次结构,并且该视图控制器的视图正在进入层次结构”。无论我们是在前台还是后台启动,视图控制器调用都应该是稳定的。
(看到这一点,想象一下相反的情况;一切都会崩溃!启动就是启动,视图控制器就是视图控制器;你必须得到预期的事件,否则应用程序将崩溃。)
但是,让我在这里发出更强烈的警告,而我有肥皂盒。不要对两个不同的生命周期将如何相互交错做出任何假设。应用程序的生命周期是稳定的,视图控制器的生命周期是稳定的,但是它们之间的交错方式因主要系统而异,从架构到架构(通过“架构”,我的意思是无论您使用导航控制器等)。
我有很多这方面的历史。当我第一次开始编写 iOS 时,我发现这是交错的顺序:
application(_:didFinishLaunchingWithOptions:)
viewDidLoad
viewWillAppear(_:)
applicationDidBecomeActive(_:)
viewDidAppear(_:)
依靠该顺序,我通常使用根视图控制器viewDidAppear(_:)
进行注册,UIApplication.didBecomeActiveNotification
以便在应用程序的后续激活时收到通知。
这工作了好几年。但是 iOS 8 带来了一个重大的变化:应用程序委托现在在根视图控制器接收applicationDidBecomeActive(_:)
之后viewDidAppear(_:)
接收,如下所示:
application(_:didFinishLaunchingWithOptions:)
viewDidLoad
viewWillAppear(_:)
viewDidAppear(_:)
applicationDidBecomeActive(_:)
这对我的许多应用程序来说是一场灾难,因为我刚刚注册的通知立即viewDidAppear(_:)
到达。
然后,在 iOS 9 中,这个顺序又回到了 iOS 7 和之前的状态——让我的应用程序再次陷入混乱。然后,在 iOS 11 中,顺序又恢复到了 iOS 8 中的顺序!
道德是你不应该像我一样依赖不同对象的生命周期事件之间的时间关系。我所做的总是错的。