iOS开发笔记——iOS13删除storyBoard后的适配
本文适用于xcode升级11后依然使用纯代码创建项目(不使用main.storyboard)
iOS13更新以后,使用Xcode11创建一个Single View App项目,会多生成一些文件和代码
①多了SceneDelegate代理
②Info.plist里面多了Application Scene Manifest配置
在iOS13中appdelegate的职责发现了改变:
iOS13之前,Appdelegate的职责全权处理App生命周期和UI生命周期;
iOS13之后,Appdelegate的职责是:
①、处理 App 生命周期
②、新的 Scene Session 生命周期 那UI的生命周期呢?交给新增的Scene Delegate处理, Appdelegate不在负责UI生命周期,所有UI生命周期交给SceneDelegate处理
下面会给出一些删除了storyBoard后的适配方案
适配方案
一、项目不支持多场景窗口
直接将多出来的文件和代码删除
①删除SceneDelegate代理文件 (可选)
②删除 Info.plist里面的Application Scene Manifest配置(一定要删除)
③删除 AppDelegate代理的两个方法:
application:configurationForConnectingSceneSession:options:
application: didDiscardSceneSessions:
注:这两个方法一定要删除,否则使用纯代码创建的Window和导航控制器UINavigationController不会生效。
二、项目支持多场景窗口
1、iOS13及以上版本
在SceneDelegate的方法scene:willConnectToSession:options:中创建UIWindow和UINavigationController
代码如下
- (void)scene:(UIScene *)scene willConnectToSession:(UISceneSession *)session options:(UISceneConnectionOptions *)connectionOptions {
self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];
self.window.windowScene = (UIWindowScene*)scene;
UINavigationController *rootNavgationController = [[UINavigationController alloc] initWithRootViewController:[ViewController new]];
self.window.rootViewController = rootNavgationController;
[self.window makeKeyAndVisible];
}
如图
2、同时兼容iOS13和iOS12及以下
多场景窗口、SceneDelegate等只有在iOS13才可以,若要考虑iOS12及以下的运行环境,那么需考虑环境版本匹配
//注:@available方法 在iOS 10以下调用会闪退,既然是多版本兼容,那还是使用旧的判断版本方式吧
①除了与以前版本一样,要删除Main storyboard file base name之外, 还要在项目Info.plist中, 删除SceneDelegate的StoryboardName
②AppDelegate.m部分代码
代码如下
#import "AppDelegate.h"
#import "CTTabBarViewController.h"
#define ISIOS(number) ([[[UIDevice currentDevice] systemVersion] floatValue] >= number) ? YES : NO
@interface AppDelegate ()
@end
@implementation AppDelegate
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
// if (@available(iOS 13,*)) { //注:@available 在iOS 10以下调用会闪退,既然是多版本兼容,那还是使用旧的判断版本方式吧
if (ISIOS(13.0)) {
return YES;
} else {
self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];
CTTabBarViewController *vc = [[CTTabBarViewController alloc] init];
// UINavigationController *rootNavgationController = [[UINavigationController alloc] initWithRootViewController:[ViewController new]];
self.window.rootViewController = vc;
[self.window makeKeyAndVisible];
return YES;
}
}
如图
③SceneDelegate部分代码
代码如下
- (void)scene:(UIScene *)scene willConnectToSession:(UISceneSession *)session options:(UISceneConnectionOptions *)connectionOptions {
if (scene) {
self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];
if (@available(iOS 13.0, *)) { //注:@available 在iOS 10以下调用会闪退
self.window.windowScene = (UIWindowScene*)scene;
CTTabBarViewController *vc = [[CTTabBarViewController alloc] init];
// UINavigationController *rootNavgationController = [[UINavigationController alloc] initWithRootViewController:[ViewController new]];
self.window.rootViewController = vc;
[self.window makeKeyAndVisible];
} else {
}
} else {
}
}
如图