如何解决当应用程序启动到后台时,是否应该调用 viewcontroller llfecycle 事件?
我一直都知道window?.makeKeyAndVisible()
要在didFinishLaunching
内完成
但我也认为根视图控制器的生命周期事件不会被调用,直到应用程序被前景化。想法不正确吗?
即通过调用 makeKeyAndVisible
— 即使应用程序仅在后台启动,我也会看到它的 viewDidLoad
、viewWillAppear
和 viewDidAppear
方法被调用。
这是预期的吗?!
解决方法
是的,有点。 “出现”并不意味着“用户即将看到它”。这意味着“正在组装视图控制器层次结构,并且此视图控制器的视图正在进入层次结构”。无论我们是在前台还是后台启动,视图控制器调用应该是稳定的。
(要看到这一点,请想象相反;一切都会崩溃!启动正在启动,视图控制器就是视图控制器;您必须获得预期的事件,否则应用程序会崩溃。) >
但是让我在这里发出更强烈的警告,因为我有肥皂盒。不要对两个不同的生命周期如何相互交错做出任何假设。 app 生命周期稳定,视图控制器生命周期稳定,但它们之间的交错方式因主要系统而异和 em> 从架构到架构(“架构”是指您是否使用导航控制器等很重要)。
我在这方面有很多历史。当我第一次开始为 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 中的顺序!
道德是你不应该像我一样依赖不同对象的生命周期事件之间的时间关系。我所做的总是错误。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。