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

时间:2015-12-08 15:03:23

标签: ios swift appdelegate uiwindow

当我找到这句话时,我正在阅读Apple docs

  

AppDelegate类包含一个属性:window

     

var window: UIWindow?

     

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

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

3 个答案:

答案 0 :(得分:8)

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

在下面的图片中,包围的红色 适用于您的应用仍在某事的情况,但不再是 on < / em>屏幕。它在后台,因此AppDelegate不再需要window。因此,它将设置为nil

简单概述

enter image description here

详细信息概述

enter image description here

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
}

答案 1 :(得分:5)

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

application(_:performFetchWithCompletionHandler:)
application(_:handleEventsForBackgroundURLSession:completionHandler:)

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

与往常一样,https://www.elastic.co/guide/en/elasticsearch/guide/current/scan-scroll.html?q=scan%20scroll

更多

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

答案 2 :(得分:4)

以编程方式创建窗口而不是使用自动设置window属性的主故事板时,这一点变得更加明显。

当创建委托对象(在您的案例中为AppDelegate)时,您可能不希望或不能立即创建窗口。通常,在调用application(_:didFinishLaunchingWithOptions:)之前,您无需创建窗口并设置属性。因此,在创建窗口并设置属性之前,它将为nil 与Losiowaty already stated一样,当应用程序启动但未向用户显示时也是如此 - 例如当只是在后台处理位置更新或其他信息时。

如果属性是非可选的,那么在创建AppDelegate对象时,您将被迫创建窗口,这既不是必需的也不是必需的。