【iOS】iOS13后新增的Scene Delegate和不使用工程自带的Main.storyboard
一、Scene Delegate
在之前我们对AppDelegate已经很熟悉,它是iOS app的入口,application(_:didFinishLaunchingWithOptions:)是我们app启动后系统调用的第一个函数。AppDelegate类实现了UIKit库中的UIApplicationDelegate 协议。而到了iOS13 AppDelegate的角色将会发生变化,后面我们会详细讨论。
在iOS13之前我们一般会在AppDelegate中做的事情:
1.创建app的第一个view controller也就是 rootViewController
2.配置并启动一些像日志记录和云服务之类的组件
3.注册推送通知处理程序,并响应发送到app的推送通知
4.响应应用程序生命周期事件,例如进入后台,恢复应用程序或退出应用程序(终止)
但是在iOS13后,AppDelegate文件结构也发生变化,在AppDelegate.h文件中没有了window属性,而是在sceneDelegate.h中,可见AppDelegate不管理window而是交给SceneDelegate。
#pragma mark - UISceneSession lifecycle
/*
1.如果没有在APP的Info.plist文件中包含scene的配置数据,或者要动态更改场景配置数据,需要实现此方法。 UIKit会在创建新scene前调用此方法。
2.方法会返回一个UISceneConfiguration对象,其包含其中包含场景详细信息,包括要创建的场景类型,用于管理场景的委托对象以及包含要显示的初始视图控制器的情节提要。 如果未实现此方法,则必须在应用程序的Info.plist文件中提供场景配置数据。
总结下:默认在info.plist中进行了配置, 不用实现该方法也没有关系。如果没有配置就需要实现这个方法并返回一个UISceneConfiguration对象。
配置参数中Application Session Role 是个数组,每一项有三个参数:
Configuration Name: 当前配置的名字;
Delegate Class Name: 与哪个Scene代理对象关联;
StoryBoard name: 这个Scene使用的哪个storyboard。
注意:代理方法中调用的是配置名为Default Configuration的Scene,则系统就会自动去调用SceneDelegate这个类。这样SceneDelegate和AppDelegate产生了关联。
*/
//参数options是一个UISceneConnectionOptions类,官方解释:它包含了为什么要创建一个新的scene的信息。根据参数信息判断是否要创建一个新的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];
}
// 在分屏中关闭其中一个或多个scene时候回调用
- (void)application:(UIApplication *)application didDiscardSceneSessions:(NSSet<UISceneSession *> *)sceneSessions {
// Called when the user discards a scene session.
// If any sessions were discarded while the application was not running, this will be called shortly after application:didFinishLaunchingWithOptions.
// Use this method to release any resources that were specific to the discarded scenes, as they will not return.
}
SceneDelegate 生命周期
- (void)scene:(UIScene *)scene willConnectToSession:(UISceneSession *)session options:(UISceneConnectionOptions *)connectionOptions {
NSLog(@"场景加载完成");
// iOS 12上的 application(_:didFinishLaunchingWithOptions:) 函数的作用最相似。当将场景添加到app中时scene(_:willConnectTo:options:)函数会被调用的。
}
- (void)sceneDidDisconnect:(UIScene *)scene {
NSLog(@"场景已经断开连接");
// (注意,以后它可能被重新连接)
}
- (void)sceneDidBecomeActive:(UIScene *)scene {
NSLog(@"已经从后台进入前台 ");
//(例如从应用切换器中选择场景)
}
- (void)sceneWillResignActive:(UIScene *)scene {
NSLog(@"即将从前台进入后台");
//(例如通过切换器切换到另一个场景)
}
- (void)sceneWillEnterForeground:(UIScene *)scene {
NSLog(@"即将从后台进入前台");
}
- (void)sceneDidEnterBackground:(UIScene *)scene {
NSLog(@"已经从前台进入后台");
}
综合上面所述,我们发现这个新代理只在iOS13之后才会出现,而且也只在iPad中才会用到。如果我们不支持多窗口,所以我们可以移除这个新的代理,并按照之前的习惯进行开发。
1.直接删除Scene Delegate.h/.m文件
2.在AppDelegate.h添加@property (strong, nonatomic) UIWindow * window;属性
3移除Appdelegate中的UIScene代理
4.在info.plist文件中移除Application Scene Manifest
但是如果支持的话,那么老的AppDelegate管理生命周期的方法将不会有效,需要使用SceneDelgate中的UIScene提供的生命周期方法。
如何开启分屏多窗口显示?
1.第一步:Xcode的配置-开启支持多屏scene

2.info.plist文件进行修改,勾选分屏,enable Multipe Windows 设置为YES.

二、不使用工程自带的Main.storyboard
在Xcode中新建工程,一般都会带有默认的Main.storyboard方便我们进行快捷开发。但是在日常开发中,我们很少使用它。那么如何删除呢?
步骤如下:
(1)在工程配置中移除main的关联

(2)移除main.storuboard中的关联

(3)删除main.storyboard文件
(4)在info.plist中的查看是否有main的残留和删除在scene中的storyboardname
(5)如果是不支持scene就在AppDelegate中添加代码。如果支持就在SceneDelegate中添加代码。
// app delegate
self.window = [[UIWindow alloc]initWithFrame:[UIScreen mainScreen].bounds];
self.window.rootViewController = [[MainTabBarController alloc] init];
[self.window makeKeyAndVisible];
// secnedelegate
if (scene) {
UIWindowScene *windowSecne = (UIWindowScene*)scene;
self.window = [[UIWindow alloc] initWithWindowScene:windowSecne];
self.window.frame = windowSecne.coordinateSpace.bounds;
self.window.rootViewController = [ViewController new];
[self.window makeKeyAndVisible];
}
【iOS】iOS13后新增的Scene Delegate和不使用工程自带的Main.storyboard的更多相关文章
- ios常见细节问题-删掉main.storyboard程序启动屏幕变黑-崩溃
删掉程序默认的main.storyboard文件后,程序启动崩溃 如图所示.原因是删掉main.storyboard文件后没有在info.plist文件里面设置 删掉main.storyboard后程 ...
- 用python+selenium登录cnblog后新增文章后再次删除该文章
目的:登录cnblog后新增文章后再次删除该文章并验证 代码如下: #coding: utf-8 from selenium import webdriver from time import sle ...
- 织梦(dedecms)如何清空全部文章和删除后新增文章id号归1的方法
很多朋友在使用织梦程序做网站的过程中,难免需要添加一些测试文章用于测试网站功能模板等,还有些人朋友网站改版需要变更内容的时候,面对着众多的老文章后总是一筹莫展! 由于织梦后台并不自带一键删除整站文章的 ...
- iOS打包后收不到推送信息
今天遇到的一个特别神奇的问题: 应用在测试环境下打的包收不到推送了,打包之后都没有推送,但是我真机测试又是可以收到推送消息的.经过好久才找到原因,感觉很坑.这里记录一下问题: 1.由于我的推送第三方使 ...
- [转]iOS学习笔记(2)--Xcode6.1创建仅xib文件无storyboard的hello world应用
转载地址:http://www.mamicode.com/info-detail-514151.html 由于Xcode6之后,默认创建storyboard而非xib文件,而作为初学,了解xib的加载 ...
- iOS学习笔记(2)--Xcode6.1创建仅xib文件无storyboard的hello world应用
http://www.mamicode.com/info-detail-514151.html 由于Xcode6之后,默认创建storyboard而非xib文件,而作为初学,了解xib的加载原理很重要 ...
- XMPP之ios即时通讯客户端开发-配置XMPP基本信息之工程代码(五)
登录功能完成以后包含以下代码文件: AppDelegate.h AppDelegate.m LoginViewController.h LoginViewController.m LoginUser. ...
- iOS 给Main.storyboard 添加button 事件《转》
XCODE中使用Main.Storyboard拉入控件并实现事件(Swift语言) 如何在XCODE中的Main.Storyboard内拉入控件并实现一个简单的效果呢?本人由于刚接触Swift语言 ...
- 从零开始学ios开发(七):Delegate,Action Sheet, Alert
Action Sheet和Alert是2种特殊的控件(暂且称之为控件吧,其实不是控件真正的控件,而是ios中的2个类,这2个类定义了2种不同类型的用于和用户交互的弹出框),Action Sheet是从 ...
- IOS开发-UI学习-delegate(代理)的使用,键盘消失
代理是IOS开发中用到的一种设计模式.今天做了一个代理的小练习: 以下项目实现了两个页面之间的相互切换,并且在切换页面的时候完成了从一个页面往另一个页面的传值.从主页面往其他页面传值是容易的,但是反过 ...
随机推荐
- Exceptionless 5.x 无法正常发送邮件的问题解决
你有碰到过通过docker部署Exceptionless无法发送邮件的问题吗?此解决办法适用于Exceptionless 5.x版本(如果你不想升级6.x的话). 1.问题起因 去年这个时候,得知Ex ...
- Xamarin.Android 关于GridView 的正确使用方式
https://blog.csdn.net/qq_35504350/article/details/78189004 这个是重点 JavaList<IDictionary<string, ...
- C# 使用Newtonsoft.Json
https://blog.csdn.net/qq_38762313/article/details/100161149 对象转json字符串 string jsStr=Newtonsoft.Json. ...
- 使用openOffice将office文件转成pdf
下载安装openoffice,下载地址:http://www.openoffice.org/download/ 我安装的目录: 输入cmd回车 在命令窗口输入 soffice -headless -a ...
- react-router v6 路由
前言 之前写react的时候 路由真的是难用,这次更新后,极为好用! 嵌套路由 main.jsx import './index.css'; import * as React from 'react ...
- GAMES 103 动画基础作业1 impulse 浅浅解析
简介 impulse 简单而言就是脉冲. 脉冲就是, 在碰撞的时候给一个脉冲. 导致其速度和角速度改变. pipeline Q&A 简述Vi 和 ViNew Vi 就是碰撞点速度的均值 ViN ...
- raspberry 修改static ip地址,ssh 可以访问到
raspberry 修改static ip地址,ssh 可以访问到 转载连接 http://www.jianshu.com/p/2c2a8291728d 如果我们希望直接不通过电脑直接连接登录到树莓派 ...
- SPI总线协议
SPI总线协议 0. 概述 数据线: SCL :同步时钟线,用于控制时序,可通过CPOL设置极性 MOSI :主机发送-从机接收 数据线 MISO :主机接收-从机发送 数据线 CS/NSS:片选信号 ...
- 「CSP-2023 游记」落叶随风将要去何方,只留给天空美丽一场。
落叶随风将要去何方, 只留给天空美丽一场. 曾飞舞的声音, 像天使的翅膀. $\ \ \ \ \ \ \ \ \ \ $--<天使的翅膀> \(\tt{Day}\) \(-1\) 像往常一 ...
- 关于VUE项目请示接口报错:Error: Network Error at createError (createError.js:17) at XMLHttpRequest.handleError的问题处理
今天在开发VUE项目时,发现一个问题,请示后端接口时报错,但是调试后端接口请示正常,但是前端就报错 看浏览器错误信息如下: 调试看到请示错误信息如下: Error: Network Error at ...