簡體   English   中英

為什么AppDelegate.swift窗口是可選的?

[英]Why is AppDelegate.swift window an optional?

當我發現這句話時,我正在閱讀Apple文檔

AppDelegate類包含一個屬性: window

var window: UIWindow?

此屬性存儲對應用程序窗口的引用。 此窗口表示應用程序視圖層次結構的根。 它是您繪制所有應用內容的地方。 請注意,window屬性是可選的 ,這意味着它在某些時候可能沒有值( 為零 )。

我不明白的是:為什么這個屬性在某些時候可能是零? 是什么情況(來)是零?

當您關閉應用程序時,您的應用程序仍然可以在后台接收靜音通知或下載數據,跟蹤您的位置,播放音樂等。

在下面的圖像中,包圍的紅色 適用於您的應用仍處於執行狀態的情況,但不再顯示在屏幕上。 它在后台,所以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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM