首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

使用SceneDelegate在AppDelegate中设置UIWindow

在iOS应用开发中,SceneDelegate是一个新的类,用于管理应用程序的多个场景(scenes)。它在iOS 13及更高版本中引入,用于替代之前在AppDelegate中管理应用窗口的方式。

在AppDelegate中设置UIWindow是在iOS 13之前的做法。在iOS 13及更高版本中,使用SceneDelegate来管理应用程序的窗口。

SceneDelegate类负责处理应用程序的不同场景,每个场景都有自己的窗口和视图层次结构。通过SceneDelegate,可以在应用程序中创建和管理多个窗口,每个窗口都可以显示不同的用户界面。

使用SceneDelegate在AppDelegate中设置UIWindow的步骤如下:

  1. 在AppDelegate中,删除之前设置UIWindow的代码。
  2. 创建一个新的SceneDelegate类,继承自UIResponder,并遵循UIWindowSceneDelegate协议。
  3. 在SceneDelegate类中,实现scene(_:willConnectTo:options:)方法。这个方法在应用程序启动时被调用,可以在其中创建和配置应用程序的窗口。
  4. scene(_:willConnectTo:options:)方法中,获取窗口场景(window scene)并创建一个新的UIWindow对象。
  5. 设置窗口的根视图控制器(root view controller)。
  6. 将窗口设置为场景的窗口(scene's window)。

下面是一个示例代码:

代码语言:txt
复制
import UIKit

class SceneDelegate: UIResponder, UIWindowSceneDelegate {

    var window: UIWindow?

    func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {
        guard let windowScene = (scene as? UIWindowScene) else { return }
        
        // 创建一个新的UIWindow对象
        let newWindow = UIWindow(windowScene: windowScene)
        
        // 设置窗口的根视图控制器
        let rootViewController = ViewController() // 替换为你的根视图控制器
        newWindow.rootViewController = rootViewController
        
        // 将窗口设置为场景的窗口
        self.window = newWindow
        newWindow.makeKeyAndVisible()
    }
}

在这个示例中,我们创建了一个新的UIWindow对象,并将其设置为场景的窗口。然后,我们设置了窗口的根视图控制器,并使其可见。

这种使用SceneDelegate在AppDelegate中设置UIWindow的方式可以让应用程序更好地适应多场景的环境,例如在iPad上同时显示多个应用程序窗口。它提供了更灵活和强大的窗口管理功能。

腾讯云相关产品和产品介绍链接地址:

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

iOS13 Scene Delegate

application(_:didDiscardSceneSessions:) : 分屏关闭其中一个或多个scene时候回调用,可以该函数销毁场景所使用的资源。...三、SceneDelegate适配 从iOS13开始AppDelegate不再有window属性,window属性被定义SceneDelegate。...保留Application Scene Manifest配置项不予删除时(其中,项目是否支持多窗口功能是个可勾选项),AppDelegate的生命周期方法不再起作用,需要在SceneDelegate使用...使用此方法可以有选择地配置UIWindow窗口并将其附加到提供的UIWindowScene场景。 如果使用storyboard,则window属性将自动初始化并附加到场景。...App仍然使用UIWindow对象,但现在它们已成为scene(场景)的一部分。 if let代码块使用scene来初始化UIWindow对象。

5.2K20

iOS 新创建项目中的SceneDelegate适配

翻译解释: iOS 13(及以后版本)上,SceneDelegate将负责AppDelegate的某些功能。 最重要的是,window(窗口)的概念已被scene(场景)的概念所代替。...Xcode 11新创建的项目涉及到SceneDelegate的地方如下: AppDelegate两个“scene sessions”方法:application(:configurationForConnecting...另外一种则是根据系统版本判断兼容 方法一:删除SceneDelegateAppDelegateUISceneSession Lifecycle的两个代理方法删除,添加window属性,application...:didFinishLaunchingWithOptions:方法初始化window,设置根视图 删除SceneDelegate文件 选中target,切换到info,删除Application Scene...,然后声明@avaiable(iOS 13, *), AppDelegate的启动方法也需要修改,编译即可 // SceneDelegate.swift import UIKit @available

2.9K21

xcode11新增SceneDelegate文件

新创建项目目录 AppDelegateSceneDelegate是iPadOS带来的新的多窗口支持的结果,并且有效地将应用程序委托的工作分成两部分。...原来iOS13AppDelegate的文件结构发生了变化: iOS13以前:AppDelegate处理App生命周期和UI生命周期; iOS13以后:处理 App 生命周期和新的 Scene...Session 生命周期,AppDelegate.h文件没有了window属性,而是SceneDelegate,可见AppDelegate不管理window而是交给SceneDelegate。...method to release any resources that were specific to the discarded scenes, as they will not return. } 3.AppDelegate...1.SceneDelegate添加@available(iOS 13, *); 2.AppDelegate同样声明window属性,代码: - (BOOL)application:(UIApplication

1.9K21

SwiftUI-开发iOS项目

项目文件.png AppDelegate.swift — 它负责App的启动与终止,并负责与SceneDelegate交接。...,它的 scene(_:willConnectTo:options:)将会被调用,设置window的根视图控制器 初始化根视图控制器时会初始化ContentView的View,显示出来 ContentView...SceneDelegate.swift中会看到这样的代码: //创建window let window = UIWindow(windowScene: windowScene) //设置window的...window的rootViewController时,初始化了ContentView,UI 界面就可以显示出来 这段代码应该很熟悉,UIKit纯代码构建 iOS 程序,会经常在 AppDelegate...ViewController 使用代码或者利用 StoryBoard、XIB来完成的布局界面的事情,现在一个继承自 View 的结构体搞定 ContentView内部,有一个 body ,返回一个

4.7K10

iOS性能优化之启动优化

虽然每一页数据加载到内存的速度很快,毫秒级别,但在应用冷启动时,可能会出现大量的缺页中断,对启动速度带来一定的时间消耗 使用测试项目,查看应用在启动过程,Page Fault所带来的消耗 Xcode...文件,按固定格式,将启动时需要的方法/函数顺序排列,然后Xcode中使用.order文件即可。...[AppDelegate load] _main 复制代码 让Xcode使用.order文件,Build Setting→Order File配置 编译项目,打开LinkMap文件 # Symbols...window] -[SceneDelegate setWindow:] -[SceneDelegate window] -[AppDelegate application:didFinishLaunchingWithOptions...→Write Link Map File,设置为YES\ 编译项目,打开LinkMap文件\ 配置生效,二进制重排成功\ 5.6.5 swift的函数符号 Other C Flags的配置,仅对

1.8K11

iOS开发·UIWindow与视图层级调整技巧(makeKeyWindow,resignKeyWindow,makeKeyAndVisible,keyWindow,windowLevel,UIWind

如何查看App的UIWindow层级 一. 为App初始化一个默认UIWindow对象 AppDelegate.m需要初始化一个window属性,作为后面往App添加视图的容器 1....如果想显示一个UIWindow,同时设置为keyWindow,并将其显示同一windowLevel的其它任何UIWindow之上 - (void)makeKeyAndVisible PS: 上述方法真的会将其显示同一...获取AppDelegate单例的window属性 专门获取AppDelegate.m文件的window属性,不包含其它其定义的window [[[UIApplication sharedApplication...调试打印例子 启动APP,AppDelegate.m的window属性 (lldb) po self.window <UIWindow: 0x15fd24390; frame = (0 0; 320...也可专门查看AppDelegate.m的window属性:假设UIWindow *delegateWindow = [[[UIApplication sharedApplication] delegate

7.8K10

iOS四大对象之UIWindow及四大对象之间的关系1. UIWindow使用纯代码加载根控制器2. UIWindow的创建过程3. 四大对象之间的关系

UIWindow/使用纯代码加载根控制器 UIWindow是一种特殊的UIView,通常在一个app只会有一个UIWindow -iOS程序启动完毕后,创建的第一个视图控件就是UIWindow,接着创建控制器的...UIWindow的创建过程 2.1 在有storyboard的创建过程 先执行Main函数,执行UIApplicationMain(),根据其第三个和第四个参数创建Application 创建代理,并且把代理设置给...5.4.2 纯代码的创建过程 先执行Main函数,执行UIApplicationMain(),根据其第三个和第四个参数创建Application 创建代理,并且把代理设置给application 开启一个事件循环...该方法,创建一个Window 然后创建一个控制器,并把该控制器设置UIWindow的根控制器 接下来再将window显示出来,即看到了运行后显示的界面。 3....:view属性 第一个创建的对象是UIApplication UIApplication绑定一个AppDelegate对象 AppDelegate对象中有一个window属性(UIWindow)

1.7K30

Clang代码覆盖率检测(插桩技术)

直接运行代码,控制台输出如下: INIT Count: 14 main -[AppDelegate application:didFinishLaunchingWithOptions:] -[SceneDelegate...你可能看到有许多重复的符号,这是由于trace-pc-guard设定的,其会对源码任意的代码块开始执行时进行插桩函数回调,包括if判断,while循环以及Block调用等,例如你可以尝试ViewController.m...文件的viewDidLoad方法添加一些代码,如下: - (void)viewDidLoad { [super viewDidLoad]; printf("开始Block=======...==================\n"); if (n < 10) { n++; } } 运行项目,输出效果如下: INIT Count: 18 main -[AppDelegate...通常我们在做二进制重排时,更关注的是函数的调用顺序,使用func等级即可,编译设置如下: -fsanitize-coverage=trace-pc,func 专注技术,热爱生活,交流技术,也做朋友。

1.6K50

MvvmCross 下使用 iOS Storyboard

MvvmCross 下使用 iOS Storyboard ? Storyboard 的优点: 可视化; XamarinStudio 自带 Storyboard 编辑器, 不用启动 Xcode 。...Storyboard 的缺点: 只有一个文件, 不利于多人同时编辑; MvvmCross 不推荐使用 UIStoryboardSegue , 因为和 Mvx 的 Command 功能上冲突, 这里以...添加 Storyboard 支持需要的步骤 初始化 Storyboard AppDelegate 添加一个 Storyboard 属性, 并在 FinishedLaunching 方法中加载 Storyboard...Setup 设置使用自定义的 StoryboardViewsContainer 重写 Setup 的 CreateTouchViewsContainer 方法, 返回上面自定义的 StoryboardViewsContainer...InstantiateViewController 来创建 ViewController 实例; 修改 ViewController 对应类型的基类, 继承自对应的 Mvx***ViewController; 本文的例子

70810

设计模式 - 命令模式&中介者模式&组合模式~AppDelegate 解耦

AppDelegate中常见的业务会包括: 生命周期中的事件处理及传播; 管理 UI 堆栈配置:选择初始视图控制器,执行根视图控制器转换; 管理后台任务; 管理通知; 三方库初始化; 管理设备方向; 设置...并且因为AppDelegate会影响整个 APP,所以面对复杂的AppDelegate时,我们就会小心翼翼,生怕自己自己的改动影响到其他的功能。...使用命令模式改造AppDelegate后,当我们需要在回调增加处理逻辑时,我们无需再修改AppDelegate,而是直接增加相应的Command类,并且AppDelegateCommandsBuilder...其实中介者模式组件化通信方案也比较常用,后面有时间会给大家介绍一下,如果大家有兴趣也可以自己去了解一下,也就是我们常说的CTMediator方案。...对于AppDelegate而言,其内部不会再有任何业务上的逻辑,并且因为协议的默认实现,已经将任务默认分发到各个Leaf,其剩余的任务仅仅就是提供Leaf列表,并且考虑到组件化环境使用,不直接引用各

58320
领券