前幾天更新好Xcode11後,運行舊項目,相安無事,內心捏了一把汗,終於沒有跟往年那樣一更新就給你一大堆報錯了。剛纔突發奇想,使用Xcode11新建iOS項目時,若是你跟往常同樣在Appdelegate
的- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
方法中建立根控制器,會崩潰報錯: bash
Appdelegate
找不到設置window的方法。session
而後發現Xcode自動新增了一個SceneDelegate
文件,查找了一下官方文檔WWDC2019:Optimizing App Launch 發現,iOS13中appdelegate的職責發現了改變: iOS13以前,Appdelegate的職責全權處理App生命週期和UI生命週期; iOS13以後,Appdelegate的職責是: 一、處理 App 生命週期 二、新的 Scene Session 生命週期 那UI的生命週期呢?交給新增的Scene Delegate處理 用圖表示就是: iOS13以前: app
可是iOS13以後,Appdelegate
不在負責UI生命週期,全部UI生命週期交給SceneDelegate
處理: ide
所以初始化window方法須要改變: 如今再也不Appdelegate
的- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
進行初始化,轉交給SceneDelegate
的willConnectToSession:
方法進行根控制器設置:spa
- (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];
}
複製代碼