前幾天更新好Xcode11后并扇,運行舊項目,相安無事寞秃,心里捏了一把汗,終于沒有跟往年那樣一更新就給你一大堆報錯了偶惠。剛才突發(fā)奇想春寿,使用Xcode11新建iOS項目時,如果你跟往常一樣在Appdelegate
的- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
方法中創(chuàng)建根控制器,會崩潰報錯:
Appdelegate
找不到設(shè)置window的方法忽孽。
然后發(fā)現(xiàn)Xcode自動新增了一個SceneDelegate
文件绑改,查找了一下官方文檔WWDC2019:Optimizing App Launch
發(fā)現(xiàn),iOS13中appdelegate的職責(zé)發(fā)現(xiàn)了改變:
iOS13之前兄一,Appdelegate的職責(zé)全權(quán)處理App生命周期和UI生命周期厘线;
iOS13之后绎晃,Appdelegate的職責(zé)是:
1立叛、處理 App 生命周期
2、新的 Scene Session 生命周期
那UI的生命周期呢绪商?交給新增的Scene Delegate處理
用圖表示就是:
iOS13之前:
這種模式完全沒問題骂束,因為只有一個進(jìn)程耳璧,只有一個與這個進(jìn)程對應(yīng)的用戶界面
但是iOS13之后,Appdelegate
不在負(fù)責(zé)UI生命周期展箱,所有UI生命周期交給SceneDelegate
處理:
因此初始化window方法需要改變:
現(xiàn)在不再Appdelegate
的- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
進(jìn)行初始化旨枯,轉(zhuǎn)交給SceneDelegate
的willConnectToSession:
方法進(jìn)行根控制器設(shè)置:
- (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];
}