当我找到这句话时,我正在阅读Apple docs:
AppDelegate
类包含一个属性:window
。
var window: UIWindow?
此属性存储对应用程序窗口的引用。这个窗口 表示应用程序视图层次结构的根。这是所有的地方 您的应用内容已被绘制。请注意,window属性是 optional,这意味着它在某些时候可能没有价值(nil)。
我不明白的是:为什么这个属性在某些时候可能是零?是什么情况(来)是什么?
答案 0 :(得分:8)
当您关闭应用程序时,您的应用仍然可以接收silentNotifications或在后台下载数据 ,跟踪您的位置,播放音乐等。
在下面的图片中,包围的红色 适用于您的应用仍在做某事的情况,但不再是 on < / em>屏幕。它在后台,因此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
}
答案 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
对象时,您将被迫创建窗口,这既不是必需的也不是必需的。