從 iOS 13 開始,SceneDelegate 承擔了 AppDelegate 的一些職責,特別是 AppDelegate 中的 UIWindow 現在是 SceneDelegate 中的 UIScene,SceneDelegate 負責將數據和 UI 顯示在屏幕上。
當你處理場景時,對用戶來說看起來像一個窗口的東西實際上被稱為 UIScene,它由 UISceneSession 管理。 所以當我們提到 windows 時,實際上指的是 UISceneSession 物件
其中 SceneDelegate 有以下六種主要的方法:
scene(_:willConnectTo:options:)
sceneWillEnterForeground(_:)
sceneDidBecomeActive(_:)
sceneDidDisconnect(_:)
sceneWillResignActive(_:)
sceneDidEnterBackground(_:)
這些方法類似於在 iOS 13 以前的 AppDelegate 中使用的方法,以下讓我們來個別介紹
scene(_:willConnectTo:options:)
這是 UISceneSession 生命週期中調用的第一個方法,它將創建一個新的窗口 UIWindow,並設置窗口的 rootViewController,並使該窗口成為將顯示的關鍵窗口,在使用 Storyboard 時,窗口屬性將自動初始化並附加到場景中
sceneWillEnterForeground(_:)
場景連接完成後,當場景即將開始時會調用此方法,例如當應用程序第一次變為活動狀態active 或從後台過渡到前台時
sceneDidBecomeActive(_:)
在場景從非活動狀態變為活動狀態時調用,此方法在調用 sceneWillEnterForeground
方法之後也會立即調用,此時場景已設置完且可見並可供使用
sceneWillResignActive(_:)
當場景從活動狀態移動到非活動狀態時調用,這可能是由於臨時中斷(例如收到來電)而發生
sceneDidEnterBackground(_:)
當場景從前景過渡到背景時調用,使用此方法保存數據、釋放共享資源、存儲足夠多的場景特定狀態資訊以將場景恢復到當前狀態
sceneDidDisconnect(_:)
每當場景被發送到後台時,iOS 可能會決定斷開連接並清除您的場景以釋放資源。 但這並不意味著應用程序被終止或不再運行,只是場景與 session 斷開連接並且不再處於活動狀態。 當用戶再次將該特定場景置於前台時,iOS 可以決定將該場景重新連接回場景 session。
Session被用於指定場景,可用於還原場景的狀態,可以將用戶資訊存儲到場景 session 中,它是一個可以放入任何內容的dictionary
此方法要做的最重要的事情是丟棄所有不需要的資源,例如從硬碟或網路加載的數據。以及確保您保留任何重要以及難取得的數據,例如,用戶在場景中提供的任何輸入,當他們返回場景時,他們希望仍然存在。