当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《为什么AppDelegate.swift窗口是可选的?》经验,为你挑选了2个好方法。

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

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

var window: UIWindow?

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

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



1> Honey..:

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

在下面的图像中,包围的红色 适用于您的应用仍处于执行状态的情况,但不再显示在屏幕上.它在后台,所以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
}



2> Losiowaty..:

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

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

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

一如既往,更多的文档

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

推荐阅读
跟我搞对象吧
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有