SceneDelegate
2022-01-28 本文已影响0人
林希品
SceneDelegate是Xcode11新增的类。在ios13及以后版本中负责AppDelegate的某些功能,例如UI生命周期就由SceneDelegate负责,AppDelegate只负责处理 App 生命周期。如果我们还是按Xcode11以前的逻辑方式在AppDelegate.m 的didFinishLaunchingWithOptions编辑代码,运行程序会发现无论怎么操作都是不显示状态。
1.打开SceneDelegate.h文件,声明UIWindow;
@interface SceneDelegate : UIResponder <UIWindowSceneDelegate>
@property (strong, nonatomic) UIWindow * window;
@end
2.在SceneDelegate.m文件的willConnectToSession方法里设置rootViewController。
- (void)scene:(UIScene *)scene willConnectToSession:(UISceneSession *)session options:(UISceneConnectionOptions *)connectionOptions
{
if (scene) {
UIWindowScene *winScene = (UIWindowScene *)scene;
self.window = [[UIWindow alloc] initWithWindowScene:winScene];
self.window.backgroundColor = UIColor.redColor;
self.window.frame = CGRectMake(0, 0, [UIScreen mainScreen].bounds.size.width, [UIScreen mainScreen].bounds.size.height);
self.window.rootViewController = [ViewController new];
[self.window makeKeyAndVisible];
}
}
3.代理
(1)SceneDelegate.m里的代理(SceneDelegate的生命周期)
//加载场景时调用
- (void)scene:(UIScene *)scene willConnectToSession:(UISceneSession *)session options:(UISceneConnectionOptions *)connectionOptions
{
}
//当场景被系统释放时调用,比如中断连接等(在此释放场景的所有资源)
- (void)sceneDidDisconnect:(UIScene *)scene
{
}
//当场景从后台进入前台时调用,即已经从后台进入前台(使用此方法重新启动场景不活动时暂停(或尚未启动)的任何任务)
- (void)sceneDidBecomeActive:(UIScene *)scene
{
}
//当场景即将从前台进入后台时调用
- (void)sceneWillResignActive:(UIScene *)scene
{
}
//当场景从背景过渡到前景时调用,即将从后台进入前台时(使用此方法撤销进入后台时所做的更改)
- (void)sceneWillEnterForeground:(UIScene *)scene
{
}
//当场景从前景过渡到背景时调用,即已经从前台进入后台(使用该方法保存数据,释放共享资源,存储足够的场景特定状态信息,将场景恢复到当前状态)
- (void)sceneDidEnterBackground:(UIScene *)scene
{
}
(2)AppDelegate.m里的代理(UISceneSession 的生命周期)
//在创建新场景会话时调用(使用此方法选择一个配置来创建新场景)
- (UISceneConfiguration *)application:(UIApplication *)application configurationForConnectingSceneSession:(UISceneSession *)connectingSceneSession options:(UISceneConnectionOptions *)options
{
}
//关闭场景时调用(使用此方法释放特定于丢弃场景的任何资源)
- (void)application:(UIApplication *)application didDiscardSceneSessions:(NSSet<UISceneSession *> *)sceneSessions
{
}
对于很多开发者来说,也许一时半会会不适应这种操作方式,我们也可以通过删除SceneDelegate的方法,恢复Xcode11之前的开发操作方式,具体可以参考文章IOS删除SceneDelegate。