[英]Why is AppDelegate.swift window an optional?
當您關閉應用程序時,您的應用程序仍然可以在后台接收靜音通知或下載數據,跟蹤您的位置,播放音樂等。
在下面的圖像中,包圍的紅色 適用於您的應用仍處於執行狀態的情況,但不再顯示在屏幕上。 它在后台,所以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
}
你可能並不總是需要它。 例如,當調用這兩個方法時:
application(_:performFetchWithCompletionHandler:)
application(_:handleEventsForBackgroundURLSession:completionHandler:)
您的應用不會向用戶顯示,因此不需要window
。
一如既往,更多的文檔
現在,我不確定這是內在的原因,但它似乎是一個足夠好的可能性(至少對我而言)。 雖然如果有人能夠提供更多信息,我也很樂意學習更多信息。
當您以編程方式創建窗口而不是使用自動設置window
屬性的主故事板時,它變得更加明顯。
在創建委托對象(在您的情況下為AppDelegate
)時,您可能不希望或不能立即創建窗口。 通常,在調用application(_:didFinishLaunchingWithOptions:)
之前,您不需要創建窗口並設置屬性。 因此,在創建窗口並設置屬性之前,它將nil
。
像Losiowaty 已經說明的那樣 ,當應用程序啟動但不向用戶顯示時也是這種情況 - 例如,當在后台處理位置更新或其他信息時。
如果屬性是非可選的,那么在創建AppDelegate
對象時,您將被迫創建窗口,這既不是必需的也不是必需的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.