You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SceneDelegate如何通过@EnvironmentObject在RootView中可用?

问题:RootView为何能通过@EnvironmentObject获取SceneDelegate?

相关代码片段

1. 设置UISceneConfiguration代理的代码

func application(_ application: UIApplication,
                 configurationForConnecting connectingSceneSession: UISceneSession,
                 options: UIScene.ConnectionOptions) -> UISceneConfiguration {
    let sceneConfig = UISceneConfiguration(name: nil, sessionRole: connectingSceneSession.role)
    sceneConfig.delegateClass = SceneDelegate.self
    return sceneConfig
}

2. @main App的body实现

var body: some Scene {
        WindowGroup {
            RootView()
        }
}

3. RootView中获取SceneDelegate的代码

struct RootView: View {
    @EnvironmentObject private var sceneDelegate: SceneDelegate
[...]
}

原因解析

你能在RootView里通过@EnvironmentObject拿到SceneDelegate,是因为SceneDelegate实例创建后,会自动被注入到当前场景的SwiftUI环境中——这是UIKit与SwiftUI混合开发时的默认行为。

具体流程如下:

  • 系统根据你设置的sceneConfig.delegateClass = SceneDelegate.self创建SceneDelegate实例,并将其与当前UIScene绑定。
  • 你在App的body里通过WindowGroup创建的RootView,属于该UIScene对应的SwiftUI视图层级。
  • UIKit会自动把当前Scene的delegate(也就是你的SceneDelegate实例)注入到该场景下的SwiftUI环境中,因此你在RootView里用@EnvironmentObject声明后就能直接获取到,无需手动调用environmentObject(_:)方法。

内容的提问来源于stack exchange,提问作者Paweł Brewczynski

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 00:05:23