为什么AppDelegate.swift窗口是可选的?

13 uiwindow ios appdelegate swift

当我发现这句话时,我正在阅读Apple文档:

AppDelegate类仅包含一个属性:window.

var window: UIWindow?

此属性存储对应用程序窗口的引用.此窗口表示应用程序视图层次结构的根.它是您绘制所有应用内容的地方.请注意,window属性是 可选的,这意味着它在某些时候可能没有值(为零).

我不明白的是:为什么这个属性在某些时候可能是零?是什么情况(来)是零?

Hon*_*ney 10

当您关闭应用程序时,您的应用程序仍然可以在后台接收静音通知或下载数据,跟踪您的位置,播放音乐等.

在下面的图像中,包围的红色 适用于您的应用仍处于执行状态的情况,但不再显示在屏幕上.它在后台,所以AppDelegate不再需要window了.因此,它将被设置为nil

简单概述

在此输入图像描述


详细概述

在此输入图像描述

FWIW,下面的代码不会使应用程序启动vc.

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
        let vc = ViewController()
        window?.rootViewController = vc
        window?.makeKeyAndVisible()
        return true
    }
Run Code Online (Sandbox Code Playgroud)

为什么它不起作用?因为该window属性是可选的 - 最初设置为nil.它需要实例化

下面的代码将起作用

 func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
    let vc = ViewController()
    window = UIWindow(frame: UIScreen.main.bounds) // Now it is instantiated!!
    window?.rootViewController = vc
    window?.makeKeyAndVisible()
    return true
}
Run Code Online (Sandbox Code Playgroud)


Los*_*aty 5

你可能并不总是需要它.例如,当调用这两个方法时:

application(_:performFetchWithCompletionHandler:)
application(_:handleEventsForBackgroundURLSession:completionHandler:)
Run Code Online (Sandbox Code Playgroud)

您的应用不会向用户显示,因此不需要window.

一如既往,更多的文档

现在,我不确定这是内在的原因,但它似乎是一个足够好的可能性(至少对我而言).虽然如果有人能够提供更多信息,我也很乐意学习更多信息.