我一直知道window?.makeKeyAndVisible()
要在didFinishLaunching
中完成
但我也认为非根视图控制器的生命周期事件会被调用,直到应用程序是前景。思想是不正确的吗?
。通过调用makeKeyAndVisible
-即使应用程序只在后台启动,我看到viewDidLoad
,viewWillAppear
和viewDidAppear
方法被调用。
这是意料之中的吗?!
是的,有点像。"appear"并不意味着"用户即将看到它"。它的意思是"视图控制器层次结构正在被组装这个视图控制器的视图将进入层次结构"视图控制器调用应该是稳定的,无论我们是在前台还是后台启动。
(看到这个,想象相反;地狱就要爆发了!启动就是启动,视图控制器就是视图控制器;你必须得到预期的事件,否则应用程序会崩溃。
但是让我在这里做一个更强烈的警告,当我有临时演讲的时候。不要让任何假设两个不同的生命周期将如何相互交错。应用程序生命周期是稳定的,视图控制器生命周期也是稳定的,但是它们相互交错的方式在不同的主要系统和不同的架构之间有很大的不同。我的意思是,这很重要你是否使用导航控制器等)。
我有很多这方面的历史。当我第一次开始编写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中的顺序!
寓意是,你不应该像我一样,依赖于不同对象的生命周期事件之间的时间关系。我所做的总是错。