一、AppDelegate和SceneDelegate
简略地说:iOS13之前是AppDelegate管理app和UI的生命周期,在iOS13之后AppDelegate管理app的生命周期和SceneDelegate的生命周期,将UI的生命周期交给SceneDelegate管理,这也就是为什么在SceneDelegate.h中有个window。所以,在Xcode11之后创建项目,在设置setRootViewController是不能在AppDelegate里的。
ios12
1 application:(UIApplication *)application didFinishLaunchingWithOptions
2 // 初始化
3
4 application:(UIApplication *)applicationDidBecomeActive
5 // 已经被激活
6
7 application:(UIApplication *)applicationWillResignActive
8 // 即将被挂起
9
10 application:(UIApplication *)applicationDidEnterBackground
11 // 已经进入后台
12
13 application:(UIApplication *)applicationWillEnterForeground
14 // 即将回到前台
15
16 application:(UIApplication *)applicationWillTerminate
17 // 即将被杀死
iOS13
1 scene:(UIScene *)scene willConnectToSession
2 // 初始化
3
4 sceneDidBecomeActive:(UIScene *)scene
5 // 已经被激活
6
7 sceneWillResignActive:(UIScene *)scene
8 // 即将被挂起
9
10 sceneDidEnterBackground:(UIScene *)scene
11 // 已经进入后台
12
13 sceneWillEnterForeground:(UIScene *)scene
14 // 即将回到前台
15
16 sceneDidDisconnect:(UIScene *)scene
17 // 即将被杀死
二、没有分屏的情况继续用AppDelegate
1、直接删除SceneDelegate这个类并在info.plist文件中删除Application Scene Manifest选项。如下图:
2、在AppDelegate.m中注释掉下面的代码:
3、删除main.storyboard和程序初始信息
使main.storyboard为空
修改程序信息
4、在AppDelegate里设置根视图控制器
1 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
2
3 UIViewController *vc;
4 if ([JZFactory isFirstEntry]) {
5 // 第一次进入 加载引导页
6 vc = [JZGuideCollectionViewController new];
7 } else {
8 // 其他情况加载广告页
9 vc = [JZAdViewController new];
10 }
11 // 初始化UIWindow
12 self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];
13 // 设置根视图控制器
14 _window.rootViewController = vc;
15 // 设置该window可见
16 [_window makeKeyAndVisible];
17
18 return YES;
19 }
注意:要在AppDelegate.h中声明UIWindow
1 @property (strong, nonatomic) UIWindow * window;
三、需要使用分屏,就要使用SceneDelegate
1、如果因项目需要分屏,并且需要适配iOS13以下,就需要在AppDelegate的- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
方法中去加判断。代码如下:(别忘了在AppDelegate添加window属性)
1 if (@available(iOS 13,*)) {
2 return YES;
3 } else {
4 self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];
5 UINavigationController *rootNavgationController = [[UINavigationController alloc] initWithRootViewController:[ViewController new]];
6 self.window.rootViewController = rootNavgationController;
7 [self.window makeKeyAndVisible];
8 return YES;
9 }
2、同时在SceneDelegate中写window设置代码:
1 - (void)scene:(UIScene *)scene willConnectToSession:(UISceneSession *)session options:(UISceneConnectionOptions *)connectionOptions {
2
3 self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];
4 self.window.windowScene = (UIWindowScene*)scene;
5 UINavigationController *rootNavgationController = [[UINavigationController alloc] initWithRootViewController:[ViewController new]];
6 self.window.rootViewController = rootNavgationController;
7 [self.window makeKeyAndVisible];
8 }
注意:Info.plist和main.storyboard的设置如二。