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 {

}

}

如图

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一只即将拥有马甲线的羊

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值