为什么AppDelegate.swift窗口是可选的?
我正在阅读苹果文档 ,当我发现这个句子:
AppDelegate
类包含一个属性:window
。
var window: UIWindow?
该属性存储对应用程序窗口的引用。 这个窗口代表了你的应用的视图层次的根。 这是所有的应用程序内容绘制的地方。 请注意,窗口属性是一个可选的 ,这意味着它可能没有值( 无 )在某一点。
我不明白的是:为什么这个物业在某个时候可能是零? 这是什么情况(来)无?
你可能并不总是需要它。 例如,当这两个方法被调用时:
application(_:performFetchWithCompletionHandler:) application(_:handleEventsForBackgroundURLSession:completionHandler:)
你的应用程序将不会显示给用户,所以不需要window
。
一如既往,在文档中更多
现在,我不确定这是什么内在的原因,但似乎是一个很好的可能性(至less对我来说)。 虽然如果有人能够提供更多的信息,我很乐意再学习一些。
当您以编程方式创build窗口而不是使用自动设置window
属性的主故事板时,它变得更加明显。
当您的委托对象(您的案例中的AppDelegate
)被创build时,您可能不希望或不能立即创build窗口。 通常你不需要创build窗口并设置属性,直到application(_:didFinishLaunchingWithOptions:)
被调用。 所以直到窗口创build和属性设置它将是nil
。
就像Losiowaty 已经说过的那样 ,当应用程序启动时,情况也是如此,而不是显示给用户 – 例如当在后台处理位置更新或其他信息时。
如果该属性是非可选的,那么当你创buildAppDelegate
对象时,你将不得不创build窗口,这个对象既不需要也不需要。
当您closures应用程序时,您的应用程序仍然可以在后台接收无声通知或下载数据。
在下面的图像中,被圈起来的红色 是为了当你的应用程序仍然在做什么,但它不再在屏幕上。 它在后台,所以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 }