SwiftUI 2 访问 AppDelegate

问题描述 投票:0回答:1

我做了一个小型原型,它使用 Firebase Cloud Messaging 和新的 SwiftUI 2 应用程序生命周期。我通过添加了一个自定义 AppDelegate

@UIApplicationDelegateAdaptor(AppDelegate.self) var delegate
并禁用 FCM 工作的方法调配。一切都按预期进行。

今天有同事问我,是否可以通过

UIApplication.shared.delegate
获取委托对象。所以我试了一下,发现似乎有两个不同的 AppDelegate 对象:

po delegate
打印:

<MyProject.AppDelegate: 0x6000009183c0>

po UIApplication.shared.delegate
打印:

▿ Optional<UIApplicationDelegate>
  ▿ some : <SwiftUI.AppDelegate: 0x600000b58ca0>

现在我想知道访问AppDelegate的正确方法是什么?是否应该通过

@EnvironmentalObject
获取它并将其传递给所有视图?或者使用老式的方式通过
UIApplication
? 另外,我想了解为什么我最终会得到两个 AppDelegate。

ios swiftui appdelegate
1个回答
25
投票

您的

MyProject.AppDelegate
不是直接的
UIApplicationDelegate
,它通过适配器传输到内部私有
SwiftUI.AppDelegate
,这是真实的
UIApplicationDelegate
并将一些委托回调传播到您的实例。

所以解决方案可能是:

  1. 如果您需要仅在 SwiftUI 视图层次结构中访问

    @EnvironmentalObject
    ,请使用
    MyProject.AppDelegate
    (为此
    AppDelegate
    必须符合
    ObservableObject
    )。

  2. 添加并使用

    MyProject.AppDelegate
    静态属性,该属性是通过适配器创建的对象初始化的,例如

class AppDelegate: NSObject, UIApplicationDelegate {
    static private(set) var instance: AppDelegate! = nil
    
    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey : Any]? = nil) -> Bool {
        AppDelegate.instance = self    // << here !!
        return true
    }
}

现在在代码中的任何地方,您都可以通过

AppDelegate.instance
访问您的委托。

© www.soinside.com 2019 - 2024. All rights reserved.