一尘不染

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

swift

我读苹果文档 ,当我发现这句话:

AppDelegate类仅包含一个属性:window

var window: UIWindow?

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

我不明白的是:为什么此属性有时可能为零?
变成零的情况是什么?


阅读 284

收藏
2020-07-07

共1个答案

一尘不染

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

在下面的图像中,带圆圈的红色表示您的应用仍在执行某项操作时,但不再显示在屏幕上。它在
后台,因此AppDelegate不再需要window了。结果,它将被设置为nil

简单概述

详细概述

FWIW,下面的代码不会使该应用通过启动vc

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

为什么不起作用?因为该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
}
2020-07-07