SceneDelegate
Xcode 11后新建项目时,工程中除了 AppDelegate 外还会出现一个 SceneDelegate,这是为了实现iPadOS支持多窗口的结果。AppDelegate里面的window属性被移到了SceneDelegate里面,AppDelegate多了两个关于SceneDelegate的代理方法,SceneDelegate中也有相应的代理方法。

SceneDelegate 负责原 AppDelegate 的 UI 生命周期部分的职责。

使用Xcode开发项目时,需要针对iOS的不同版本做一些适配
1、最粗暴的方法,不使用SceneDelegate
如果需要支持iOS 13 及之前多个版本的iOS,且又不需要多个窗口的功能,直接不使用SceneDelegate即可
1、将文件SceneDelegate.h、SceneDelegate.m删除
2、将配置中的Supports multiple windiws项 取消

3、修改plist文件中关于SceneDelegate的配置,直接将Application Scene Manifest所对应的配置删除

4、AppDelegate内添加window属性
2、使用 SceneDelegate,并根据不同版本进行适配
在保留Application Scene Manifest配置项,AppDelegate的生命周期方法不再起作用,需要在SceneDelegate中使用UIScene提供的生命周期方法,并且需要针对 iOS 13 需要在Scene中配置和 iOS 13 以下在AppDelegate中做两套配置。
AppDelegate 内

SceneDelegate内

使用总结:
如果没有在APP的Info.plist文件中配置scene的数据,或者要动态更改场景配置数据,需要实现AppDelegate中的代理方法。 UIKit会在创建新scene前调用此方法。
- (UISceneConfiguration *)application:(UIApplication *)application configurationForConnectingSceneSession:(UISceneSession *)connectingSceneSession options:(UISceneConnectionOptions *)options {// Called when a new scene session is being created.// Use this method to select a configuration to create the new scene with.return [[UISceneConfiguration alloc] initWithName:@"Default Configuration" sessionRole:connectingSceneSession.role];
}
Xcode 11 在info.plist中默认进行了配置, 所以不实现该方法也没有关系。如果没有配置就需要实现这个方法并返回一个UISceneConfiguration对象。

info.plist配置参数中的Application Session Role是个数组,每个都有三个参数:
Delegate Class Name: 与哪个Scene代理对象关联;
StoryBoard name: 这个Scene使用的哪个storyboard。
Configuration Name: 当前配置的名字;
代理方法中调用的是配置名为Default Configuration的Scene,系统就会自动去调用SceneDelegate这个类。SceneDelegate和AppDelegate产生了关联。
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
