1. 程式人生 > IOS開發 >Xcode11新變化:SceneDelegate

Xcode11新變化:SceneDelegate

前幾天更新好Xcode11後,執行舊專案,相安無事,心裡捏了一把汗,終於沒有跟往年那樣一更新就給你一大堆報錯了。剛才突發奇想,使用Xcode11新建iOS專案時,如果你跟往常一樣在Appdelegate- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions方法中建立根控制器,會崩潰報錯:

image.png

Appdelegate找不到設定window的方法。

然後發現Xcode自動新增了一個SceneDelegate檔案,查找了一下官方文件WWDC2019:Optimizing App Launch

發現,iOS13中appdelegate的職責發現了改變: iOS13之前,Appdelegate的職責全權處理App生命週期和UI生命週期; iOS13之後,Appdelegate的職責是: 1、處理 App 生命週期 2、新的 Scene Session 生命週期 那UI的生命週期呢?交給新增的Scene Delegate處理 用圖表示就是: iOS13之前:

image.png
這種模式完全沒問題,因為只有一個程序,只有一個與這個程序對應的使用者介面

但是iOS13之後,Appdelegate不在負責UI生命週期,所有UI生命週期交給SceneDelegate處理:

image.png

image.png

因此初始化window方法需要改變: 現在不再Appdelegate

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions進行初始化,轉交給SceneDelegatewillConnectToSession:方法進行根控制器設定:

- (void)scene:(UIScene *)scene willConnectToSession:(UISceneSession *)session options:(UISceneConnectionOptions *)connectionOptions {

    UIWindowScene *windowScene = (UIWindowScene *)scene;
    self.window = [[UIWindow alloc] initWithWindowScene:windowScene];
    self.window.frame = windowScene.coordinateSpace.bounds;
    self.window.rootViewController = [UITabBarController new];
    [self.window makeKeyAndVisible];
}
複製程式碼