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/