Xcode11新变化:SceneDelegate

前几天更新好Xcode11后,运行旧项目,相安无事,内心捏了一把汗,终于没有跟往年那样一更新就给你一大堆报错了。刚才突发奇想,使用Xcode11新建iOS项目时,若是你跟往常同样在Appdelegate- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions方法中建立根控制器,会崩溃报错: bash

image.png

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

image.png
这种模式彻底没问题,由于只有一个进程,只有一个与这个进程对应的用户界面

可是iOS13以后,Appdelegate不在负责UI生命周期,全部UI生命周期交给SceneDelegate处理: ide

image.png

image.png

所以初始化window方法须要改变: 如今再也不Appdelegate- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions进行初始化,转交给SceneDelegatewillConnectToSession:方法进行根控制器设置: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];
}
复制代码
相关文章
相关标签/搜索