iOS管理多窗口的SceneDelegate
iOS管理多窗口的SceneDelegate

iOS管理多窗口的SceneDelegate

SceneDelegate,它是 iOS 13 之后引入的重要概念,用来管理「多窗口」的生命周期和 UI 设置。

SceneDelegate 是什么?

SceneDelegate 是 iOS 13 引入的,用于处理一个“场景”(Scene)生命周期的代理类。

简单说,它和 AppDelegate 分工合作 —— AppDelegate 管全局的 App 生命周期,SceneDelegate 管一个具体 UI 界面的生命周期(比如一个窗口或屏幕内容)。

为什么会有 SceneDelegate?

以前 iOS 是单窗口(一个界面),所以只需要 AppDelegate。

从 iOS 13 开始,系统支持:

1、iPad 上多窗口(可以打开 App 的多个实例)

2、更灵活的 UI 生命周期管理

于是 Apple 引入了:

1、UIScene

2、UISceneDelegate(通常叫 SceneDelegate)

主要功能

SceneDelegate.swift 是项目中默认生成的文件,它通常包含如下方法:

func scene(_ scene: UIScene,
    willConnectTo session: UISceneSession,
    options connectionOptions: UIScene.ConnectionOptions)

这个方法是设置 UI 的关键,类似旧时代的 AppDelegate 中 window.rootViewController = …

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 }

        let window = UIWindow(windowScene: windowScene)
        window.rootViewController = MyRootViewController()
        self.window = window
        window.makeKeyAndVisible()
    }
}

这段代码完成了:

1、创建 UIWindow。

2、设置 rootViewController。

3、展示窗口。

AppDelegate 和 SceneDelegate 的区别

1、生命周期:AppDelegate管理整个 App 的启动、退出等生命周期,SceneDelegate管理每个窗口(Scene)的生命周期。

2、负责范围:AppDelegate管理全局,SceneDelegate管理单个界面。

3、UI 设置:AppDelegate为旧版本设置 window 和 rootViewController,SceneDelegate为新版本在 SceneDelegate 中设置 UI。

4、是否必须:AppDelegate在iOS 13+ 默认启用,但可以选择不启用(单场景),SceneDelegate可选(通过 info.plist 控制)。

SwiftUI和SceneDelegate

SwiftUI 项目从 iOS 14 开始默认不使用 SceneDelegate,改为使用 @main 结构:

@main
struct MyApp: App {
    var body: some Scene {
        WindowGroup {
            ContentView()
        }
    }
}

但如果使用 UIKit 嵌套 SwiftUI,或者启用了多窗口支持,仍然会用到 SceneDelegate。

总结

SceneDelegate 是 iOS 13+ 用于处理「一个界面窗口」的生命周期和 UI 搭建的控制器,通常用来设置 UIWindow 和 rootViewController。它和 AppDelegate 一起完成一个 App 的完整生命周期管理。

相关文章

1、iOS代理类AppDelegate:https://fangjunyu.com/2025/05/20/ios%e4%bb%a3%e7%90%86%e7%b1%bbappdelegate/

2、iOS UIApplication类:https://fangjunyu.com/2025/05/20/ios-uiapplication%e7%b1%bb/

   

如果您认为这篇文章给您带来了帮助,您可以在此通过支付宝或者微信打赏网站开发者。

欢迎加入我们的 微信交流群QQ交流群,交流更多精彩内容!
微信交流群二维码 QQ交流群二维码

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注