【问题标题】:SwiftUI: Access @EnvironmentObject from AppDelegateSwiftUI:从 AppDelegate 访问 @EnvironmentObject
【发布时间】:2019-06-20 19:51:51
【问题描述】:

我想在应用关闭前使用 applicationWillTerminate 函数保存一些用户默认设置。我要保存的数据存储在 EnvironmentObject 中。

如何从 AppDelegate 类访问它?

【问题讨论】:

  • 你应该在这个上面加上 [SwiftUI] 标签 :)

标签: swift swiftui xcode11 ios13


【解决方案1】:

@EnvironmentObject 不需要直接在您的 SwiftUI 对象中实例化;相反,它可以分配到其他地方(例如,您的 UISceneDelegate),然后使用 .environment(…) 函数传递。

您也可以在您的 AppDelegate 上分配它,然后通过 UISceneDelegate.scene(_:willConectTo:options:) 方法将该对象传递给您的视图。

Paul Hudson 在https://www.hackingwithswift.com/quick-start/swiftui/how-to-use-environmentobject-to-share-data-between-views 上对所有这些进行了很好的描述

【讨论】:

  • 如果有人需要此答案的代码示例。类 Test: ObservableObject{ } ------ 在 appdelegate: 类 AppDelegate: UIResponder, UIApplicationDelegate { var myVar = Test() } ------ 在 SceneDelegate: let window = UIWindow(windowScene: windowScene) let myVar = (UIApplication.shared.delegate as!AppDelegate).myVar window.rootViewController = UIHostingController(rootView: contentView.environmentObject(myVar))
  • @Nalov 您应该将此作为答案发布,以便格式清晰。这正是我所需要的:)
【解决方案2】:

如果有人需要此答案的代码示例。

1.创建符合ObservableObject的类

class Test: ObservableObject{ }

2.在 AppDelegate.Swift 中声明 var myVar = Test()

class AppDelegate: UIResponder, UIApplicationDelegate {
    var myVar = Test()

    //****
}

3.在SceneDelegate.swift中“if let windowScene = scene as?UIWindowScene {”改代码如下:

if let windowScene = scene as? UIWindowScene {

    let myVar = (UIApplication.shared.delegate as! AppDelegate).myVar
    window.rootViewController = UIHostingController(rootView: contentView.environmentObject(myVar))
    self.window = window
    window.makeKeyAndVisible()

}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-07-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多