SwiftUI 2 访问 AppDelegate

Posted

技术标签:

【中文标题】SwiftUI 2 访问 AppDelegate【英文标题】:SwiftUI 2 accessing AppDelegate 【发布时间】:2021-02-11 14:40:28 【问题描述】:

我做了一个使用 Firebase 云消息传递和新的 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。

提前致谢

【问题讨论】:

【参考方案1】:

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

所以解决办法可能是:

    如果您只需要在 SwiftUI 视图层次结构中访问您的 MyProject.AppDelegate,请使用 @EnvironmentalObject

    添加并使用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 访问您的委托。

【讨论】:

以上是关于SwiftUI 2 访问 AppDelegate的主要内容,如果未能解决你的问题,请参考以下文章

SwiftUI |从另一个 SwiftUI 视图访问 PickerView 选择

iOS:如何从 REST SwiftUi 访问和使用 API 响应数据

使用 XCTestCases 类中的可访问性标识符访问 NavigationLink - SwiftUI

Swiftui - 从 UIViewRepresentable 访问 UIKit 方法/属性

SwiftUI:如何在 Pageable 中访问 ObservedObject?

SwiftUI - 形状导致反向数组访问