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
相关产品推荐
相关产品推荐

