在 SwiftUI 生命周期中投射 AppDelegate

Cast AppDelegate in SwiftUI Lifecycle

在具有 SwiftUI 生命周期的 App 中,您如何执行以下转换,其中 AppDelegate 实现为 NSApplicationDelegateAdaptor

let appDelegate = NSApplication.shared.delegate as! AppDelegate

// or
let appDelegate = NSApp.delegate as! AppDelegate

以上抛出以下错误:

Could not cast value of type 'SwiftUI.AppDelegate' (0x1e28fae40) to 'MyApp.AppDelegate' (0x102d277c0).

后台在扩展中使用 AppDelegate

extension NSStatusBarButton {
    public override func mouseDown(with event: NSEvent) {
        super.mouseDown(with: event)
        let appDelegate = NSApp.delegate as! AppDelegate
        // do stuff with appDelegate on MouseDown Event
    }
}

我们不能转换,因为 NSApp 的委托不是我们的委托,而是内部的,它会将一些回调重定向到通过适配器注入的回调。

我们可以通过适配器的变量直接访问我们的委托:

@UIApplicationDelegateAdaptor(AppDelegate.self) var appDelegate

或通过 EnvironmentObject(因为 AppDelegate 已确认 ObservableObject 协议),它会自动注入到 ContentView 中,因此在所有子视图中都可用:

struct MyView: View {
  @EnvironmentObject var appDelegate: AppDelegate

  // ...